# vim: set et ts=4 sw=4: # # Copyright 2013-2017 Angelo Naselli # Copyright 2012 Steven Tucker # # This file is part of ManaTools # # ManaTools is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # ManaTools is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with ManaTools. If not, see . #Class Module package ManaTools::Module; use Moose; with 'ManaTools::Version'; use ManaTools::Shared; use ManaTools::Shared::Locales; use ManaTools::Shared::Logging; use ManaTools::Shared::GUI::CommandLine; use yui; #============================================================= =head1 Attributes - Optional constructor parameters =head2 icon icon attribute defines the Module icon, override this attribute by using has '+icon' => ( ... ) into your module implementation. =cut #============================================================= has 'icon' => ( is => 'rw', isa => 'Str', lazy => 1, builder => '_iconInitializer', ); sub _iconInitializer { my $self = shift; return File::ShareDir::dist_file(ManaTools::Shared::distName(), sprintf('images/%s.png', $self->name())), } #============================================================= =head2 name name attribute defines the Module name, override this attribute by using has '+name' => ( ... ) into your module implementation. =cut #============================================================= has 'name' => ( is => 'rw', isa => 'Str', required => 1, ); #============================================================= =head2 title title attribute defines the Module title, override this attribute by using has '+title' => ( ... ) into your module implementation. =cut #============================================================= has 'title' => ( is => 'rw', isa => 'Str', lazy => 1, builder => '_titleInitializer', ); sub _titleInitializer { my $self = shift; return ($self->loc->N("%s - Management Tool", $self->name())); } #============================================================= =head2 launch launch attribute defines the Module as external command to be run, pass this attribute to the "create" to set it. =cut #============================================================= has 'launch' => ( is => 'rw', isa => 'Str', ); has 'button' => ( is => 'rw', init_arg => undef, ); #============================================================= =head2 loc loc attribute defines localization object that uses "manatools" domain as default. (see ManaTools::Shared::Locales for details). To use your own Module domain, override this attribute by using has '+loc' => ( ... ) or assign it again to your ManaTools::Shared::Locales object into the extension module implementation. =cut #============================================================= has 'loc' => ( is => 'rw', isa => 'ManaTools::Shared::Locales', lazy => 1, default => sub { return ManaTools::Shared::Locales->new(); } ); #============================================================= =head2 logger logger attribute defines logging object that uses the loc attribute and goes to Syslog. (see ManaTools::Shared::Logging for details). You can use this attribute to log various messages: $log->D("debugstuff: %s", $somestring); $log->I("infostuff: %s", $somestring); $log->W("warnstuff: %s", $somestring); $log->E("errorstuff: %s", $somestring); if you wish to trace (goes to STDERR): $log->trace(1); =cut #============================================================= has 'logger' => ( is => 'rw', isa => 'ManaTools::Shared::Logging', lazy => 1, init_arg => undef, required => 0, default => sub { my $self = shift; # make sure to trigger loc & name first return ManaTools::Shared::Logging->new(loc => $self->loc(), ident => $self->name()); }, handles => ['D','I','W','E'], ); #============================================================= =head2 commandline commandline attribute defines the given command line, if --help is passed help message is shown and the module is not loaded. See ManaTools::Shared::GUI::CommandLine for details and usage. =cut #============================================================= has 'commandline' => ( is => 'ro', isa => 'ManaTools::Shared::GUI::CommandLine', init_arg => undef, default => sub { return ManaTools::Shared::GUI::CommandLine->new_with_options(); } ); #============================================================= =head1 SUBROUTINES/METHODS =head2 create =head3 INPUT %params: moudule extension construtcor parameters --CLASS name of the Class module extension name in the case of acting as a launcher mandatory parameters are name, icon and launch (see Attributes section of this manual) =head3 DESCRIPTION returns a Module instance, such as a module launcher (this object) or an extension of this class =cut #============================================================= sub create { my $class = shift; $class = ref $class || $class; my (%params) = @_; my $obj; if ( exists $params{-CLASS} ) { my $driver = $params{-CLASS}; eval { my $pkg = $driver; $pkg =~ s/::/\//g; $pkg .= '.pm'; require $pkg; $obj=$driver->new(); }; if ( $@ ) { die "Error getting obj for driver $params{-CLASS}: $@"; return undef; } } else { $obj = new ManaTools::Module(@_); } return $obj; } #============================================================= =head2 BUILD =head3 INPUT $self: this object =head3 DESCRIPTION The BUILD method is called after a Moose object is created, base Module class sets title and icon =cut #============================================================= sub BUILD { my $self = shift; ## set title yui::YUI::app()->setApplicationTitle($self->title) if $self->title; ## set icon yui::YUI::app()->setApplicationIcon($self->icon) if $self->icon; } #============================================================= =head2 setButton =head3 INPUT $self: this object $button: yui push button to be assigned to this module =head3 DESCRIPTION This method assignes a button to this module =cut #============================================================= sub setButton { my ($self, $button) = @_; $self->{button} = $button; } #============================================================= =head2 removeButton =head3 INPUT $self: this object =head3 DESCRIPTION This method remove the assigned button from this module =cut #============================================================= sub removeButton { my($self) = @_; undef($self->{button}); } # base class launcher #============================================================= =head2 start =head3 INPUT $self: this object =head3 DESCRIPTION This method is the base class launcher that runs an external module, defined in launch attribute. =cut #============================================================= sub start { my $self = shift; if ($self->{launch}) { my $err = yui::YUI::app()->runInTerminal( $self->{launch} . " --ncurses"); if ($err == -1) { system($self->{launch}); } } } no Moose; 1;