]> Frank Brehm's Git Trees - my-stuff/perl.git/commitdiff
Weitergekommen
authorFrank Brehm <frank@brehm-online.com>
Mon, 10 May 2010 23:12:08 +0000 (23:12 +0000)
committerFrank Brehm <frank@brehm-online.com>
Mon, 10 May 2010 23:12:08 +0000 (23:12 +0000)
git-svn-id: http://svn.brehm-online.com/svn/my-stuff/Perl@58 ec8d2aa5-1599-4edb-8739-2b3a1bc399aa

lib/FrBr/Common/MooseX/App.pm
lib/FrBr/Common/MooseX/FtpClient.pm [deleted file]
lib/FrBr/Common/MooseX/Role/Config.pm
lib/FrBr/Common/MooseX/Role/FtpClient.pm [new file with mode: 0644]

index 12522b6323b1394211712a7bb9ab3c57a6d308cf..04fd6511dc3d496f5ccb5d7edd5f183112037dc5 100644 (file)
@@ -165,6 +165,30 @@ sub _build_exit_code {
     return 0;
 }
 
+#-------------------------
+
+=head2 app_initialized
+
+Wurde die Anwendung initialisiert
+
+=cut
+
+has app_initialized => (
+    is              => 'rw',
+    isa             => 'Bool',
+    traits          => [ 'NoGetopt' ],
+    lazy            => 1,
+    required        => 1,
+    builder         => '_build_app_initialized',
+    documentation   => 'Wurde die Anwendung initialisiert?',
+);
+
+#------
+
+sub _build_app_initialized {
+    return 0;
+}
+
 #-----------------------------------------
 
 =head2 log4perl_cfg_file
@@ -263,17 +287,6 @@ sub OK    { 0 }
 sub ERROR { 1 }
 sub FATAL { 2 }
 
-#---------------------------------------------------------------------------
-
-before BUILD => sub {
-
-    my $self = shift;
-    $self->_init_log();
-
-    $self->exit_code( OK() );
-
-};
-
 #---------------------------------
 
 =head2 BUILD()
@@ -295,8 +308,49 @@ sub BUILD {
 #        $self->debug( "Anwendungsobjekt vor der Db-Schema-Initialisierung: ", $self );
 #    }
 
+}
+
+#---------------------------------------------------------------------------
+
+before BUILD => sub {
+
+    my $self = shift;
+    $self->_init_log();
+
+    $self->exit_code( OK() );
+
+};
+
+#---------------------------------
+
+=head2 after BUILD ...
+
+=cut
+
+after 'BUILD' => sub {
+
+    my $self = shift;
+    $self->init_app() unless $self->app_initialized;
+
+    $self->debug( "Anwendungsobjekt: ", $self ) if $self->verbose >= 3;
     $self->debug( "Bereit zum Kampf - äh - was auch immer." );
 
+};
+
+#---------------------------------
+
+=head2 init_app( )
+
+Initialisiert nach dem BUILD alles.
+
+=cut
+
+sub init_app {
+
+    my $self = shift;
+
+    $self->debug( "Initialisiere Anwendung ..." );
+    $self->app_initialized(1);
 }
 
 #---------------------------------
diff --git a/lib/FrBr/Common/MooseX/FtpClient.pm b/lib/FrBr/Common/MooseX/FtpClient.pm
deleted file mode 100644 (file)
index d473294..0000000
+++ /dev/null
@@ -1,281 +0,0 @@
-package FrBr::Common::MooseX::FtpClient;
-
-# $Id$
-# $URL$
-
-=head1 NAME
-
-FrBr::Common::MooseX::FtpClient;
-
-=head1 DESCRIPTION
-
-Rollen-Modul zum Einbinden eines FTP-Clients
-
-=cut
-
-#---------------------------------------------------------------------------
-
-use Moose::Role;
-
-#use MooseX::Getopt::Meta::Attribute;
-#use MooseX::Getopt::Meta::Attribute::NoGetopt;
-use Moose::Util::TypeConstraints;
-use Encode qw( decode_utf8 encode_utf8 );
-use Net::FTP;
-
-use utf8;
-
-use Carp ();
-
-with 'FrBr::Common::MooseX::App';
-
-#---------------------------------------------------------------------------
-
-# Versionitis
-
-my $Revis = <<'ENDE';
-    $Revision$
-ENDE
-$Revis =~ s/^.*:\s*(\S+)\s*\$.*/$1/s;
-
-use version; our $VERSION = qv("0.1"); $VERSION .= " r" . $Revis;
-
-############################################################################
-
-=head1 TYPES
-
-Alle nur von dieser Rolle verwendeten Datentypen
-
-=over4
-
-=item I<Net::FTP>
-
-=cut
-
-subtype 'Net::FTP'
-    => as 'Object'
-    => where { $_->isa('Net::FTP') }
-    => message { "Das übergebene Objekt muss vom Typ 'Net::FTP' sein" };
-
-=back
-
-=head1 ATTRIBUTES
-
-Alle durch diese Rolle definierten Attribute
-
-=head2 ftp
-
-Das Net::FTP-Objekt als eigentlicher FTP-Client.
-
-=cut
-
-has 'ftp' => (
-    is              => 'ro',
-    isa             => 'Net::FTP',
-    traits          => [ 'NoGetopt' ],
-    lazy            => 0,
-    clearer         => '_clear_ftp',
-    predicate       => 'has_ftp',
-    writer          => '_set_ftp',
-    documentation   => 'Das Net::FTP-Objekt als eigentlicher FTP-Client.',
-);
-
-#--------------------
-
-sub _set_ftp {
-    return $_[0];
-}
-
-#---------------------------------------------------------------------------
-
-=head2 ftp_connected
-
-Flag, ob der FTP-Client gerade mit dem Server verbunden ist.
-
-=cut
-
-has 'ftp_connected' => (
-    is              => 'ro',
-    isa             => 'Bool',
-    lazy            => 1,
-    traits          => [ 'NoGetopt' ],
-    builder         => '_build_ftp_connected',
-    writer          => '_set_ftp_connected',
-    documentation   => 'BOOL: Flag, ob der FTP-Client gerade mit dem Server verbunden ist.',
-);
-
-#--------------------
-
-sub _build_ftp_connected {
-    return 0;
-}
-
-sub _set_ftp_connected {
-    return $_[0];
-}
-
-#---------------------------------------------------------------------------
-
-=head2 ftp_host
-
-Der Hostname oder die IP-Adresse des FTP-Servers
-
-=cut
-
-has 'ftp_host' => (
-    is              => 'rw',
-    isa             => 'Str',
-    traits          => [ 'Getopt' ],
-    lazy            => 1,
-    required        => 1,
-    builder         => '_build_ftp_host',
-    documentation   => 'String: der Hostname oder die IP-Adresse des FTP-Servers',
-    cmd_flag        => 'ftp-host',
-    cmd_aliases     => [ 'H', 'host' ],
-);
-
-#--------------------
-
-sub _build_ftp_host {
-    return 'localhost';
-}
-
-#---------------------------------------------------------------------------
-
-=head2 ftp_blocksize
-
-Die Blockgröße in Bytes, die Net::FTP für den Datentransfer verwendet.
-
-=cut
-
-has 'ftp_blocksize' => (
-    is              => 'rw',
-    isa             => 'Int',
-    traits          => [ 'Getopt' ],
-    lazy            => 1,
-    required        => 1,
-    builder         => '_build_ftp_blocksize',
-    documentation   => 'Int: die Blockgröße in Bytes, die Net::FTP für den Datentransfer verwendet (default: 10240).',
-    cmd_flag        => 'ftp-blocksize',
-    cmd_aliases     => [ 'blocksize' ],
-);
-
-#--------------------
-
-sub _build_ftp_blocksize {
-    return 10_240;
-}
-
-#---------------------------------------------------------------------------
-
-=head2 ftp_port
-
-Die Portadresse des FTP-Servers.
-
-=cut
-
-has 'ftp_port' => (
-    is              => 'rw',
-    isa             => 'Int',
-    traits          => [ 'Getopt' ],
-    lazy            => 1,
-    required        => 1,
-    builder         => '_build_ftp_port',
-    documentation   => 'Int: die Portadresse des FTP-Servers (default: 21).',
-    cmd_flag        => 'ftp-port',
-    cmd_aliases     => [ 'port', 'P' ],
-);
-
-#--------------------
-
-sub _build_ftp_port {
-    return 21;
-}
-
-#---------------------------------------------------------------------------
-
-=head2 ftp_timeout
-
-Der Timeout in Sekunden für FTP-Prozesse (default: 120)
-
-=cut
-
-has 'ftp_timeout' => (
-    is              => 'rw',
-    isa             => 'Int',
-    traits          => [ 'Getopt' ],
-    lazy            => 1,
-    required        => 1,
-    builder         => '_build_ftp_timeout',
-    documentation   => 'Int: der Timeout in Sekunden für FTP-Prozesse (default: 120).',
-    cmd_flag        => 'ftp-timeout',
-    cmd_aliases     => [ 'timeout', 'T' ],
-);
-
-#--------------------
-
-sub _build_ftp_timeout {
-    return 120;
-}
-
-#---------------------------------------------------------------------------
-
-=head2 ftp_passive
-
-Flag, dass der FTP-Client eine passive FTP-Verbindung zum Server aufbauen soll.
-
-=cut
-
-has 'ftp_passive' => (
-    is              => 'rw',
-    isa             => 'Bool',
-    lazy            => 1,
-    required        => 1,
-    traits          => [ 'Getopt' ],
-    builder         => '_build_ftp_passive',
-    documentation   => 'BOOL: Flag, dass der FTP-Client eine passive FTP-Verbindung zum Server aufbauen soll.',
-    cmd_flag        => 'ftp-passive',
-    cmd_aliases     => [ 'passive' ],
-);
-
-#--------------------
-
-sub _build_ftp_passive {
-    return 0;
-}
-
-#---------------------------------------------------------------------------
-
-=head2 ftp_hash_size
-
-Alle wieviele Bytes soll während der Übertragung ein Hash-Zeichen (#) auf STDERR geschrieben werden,
-wenn $self->ftp_show_hashes auf TRUE gesetzt ist (default: 1024).
-
-=cut
-
-has 'ftp_hash_size' => (
-    is              => 'rw',
-    isa             => 'Int',
-    traits          => [ 'Getopt' ],
-    lazy            => 1,
-    required        => 1,
-    builder         => '_build_ftp_hash_size',
-    documentation   => 'Int: alle wieviele Bytes soll während der Übertragung ein Hash-Zeichen (#) auf STDERR geschrieben werden (default: 1024).',
-    cmd_flag        => 'ftp-hash-size',
-    cmd_aliases     => [ 'hash-size' ],
-);
-
-#--------------------
-
-sub _build_ftp_hash_size {
-    return 1024;
-}
-
-#---------------------------------------------------------------------------
-
-no Moose::Role;
-1;
-
-__END__
-
-# vim: noai: filetype=perl ts=4 sw=4 : expandtab
index 8221688512028a3d08cb4a26358b168897829cca..016ff7c8009805c812abcd8e8e95303208c807a6 100644 (file)
@@ -37,6 +37,15 @@ use version; our $VERSION = qv("0.0.1");
 
 ############################################################################
 
+=head1 Benötigte Funktionen
+
+=cut
+
+requires 'debug';                   # im Moose-Objekt FrBr::Common::MooseX:App
+requires 'init_app';                # im Moose-Objekt FrBr::Common::MooseX:App
+
+############################################################################
+
 =head1 Attribute
 
 Eigene Attribute
@@ -85,6 +94,7 @@ has 'cfg_dir' => (
     documentation   => 'Verzeichnis der Konfigurationsdateien',
     writer          => '_set_cfg_dir',
     coerce          => 1,
+    metaclass       => 'MooseX::Getopt::Meta::Attribute',
     cmd_flag        => 'cfg-dir',
     cmd_aliases     => 'cfgdir',
 );
@@ -267,6 +277,26 @@ sub BUILD {
 
 #---------------------------------------------------------------------------
 
+after 'init_app' => sub {
+
+    my $self = shift;
+
+    $self->read_config_file();
+    $self->evaluate_config();
+
+    if ( $self->verbose >= 2 ) {
+
+        my $tmp;
+        for my $f ( 'configuration_evaluated', 'configuration_read', 'cfg_stem', 'cfg_dir', 'config', 'default_config', 'used_cmd_params', ) {
+            $tmp = $self->$f();
+        }
+
+    }
+
+};
+
+#---------------------------------------------------------------------------
+
 =head2 read_config_file( [$force] )
 
 Liest die Konfiguration aus den Konfigurations-Dateien ein.
diff --git a/lib/FrBr/Common/MooseX/Role/FtpClient.pm b/lib/FrBr/Common/MooseX/Role/FtpClient.pm
new file mode 100644 (file)
index 0000000..b99cf56
--- /dev/null
@@ -0,0 +1,589 @@
+package FrBr::Common::MooseX::Role::FtpClient;
+
+# $Id$
+# $URL$
+
+=head1 NAME
+
+FrBr::Common::MooseX::Role::FtpClient;
+
+=head1 DESCRIPTION
+
+Rollen-Modul zum Einbinden eines FTP-Clients
+
+=cut
+
+#---------------------------------------------------------------------------
+
+use Moose::Role;
+
+#use MooseX::Getopt::Meta::Attribute;
+#use MooseX::Getopt::Meta::Attribute::NoGetopt;
+use Moose::Util::TypeConstraints;
+use Encode qw( decode_utf8 encode_utf8 );
+use Net::FTP;
+use Net::Domain qw( domainname );
+
+use utf8;
+
+use Carp qw( cluck );
+
+#with 'FrBr::Common::MooseX::App';
+
+#---------------------------------------------------------------------------
+
+# Versionitis
+
+my $Revis = <<'ENDE';
+    $Revision$
+ENDE
+$Revis =~ s/^.*:\s*(\S+)\s*\$.*/$1/s;
+
+use version; our $VERSION = qv("0.2"); $VERSION .= " r" . $Revis;
+
+############################################################################
+
+=head1 Benötigte Funktionen
+
+=cut
+
+requires 'debug';                   # im Moose-Objekt FrBr::Common::MooseX:App
+requires 'init_app';                # im Moose-Objekt FrBr::Common::MooseX:App
+requires 'evaluate_config';         # in der Rolle FrBr::Common::MooseX::Role::Config
+
+############################################################################
+
+=head1 TYPES
+
+Alle nur von dieser Rolle verwendeten Datentypen
+
+=over4
+
+=item I<Net::FTP>
+
+=cut
+
+subtype 'Net::FTP'
+    => as 'Object'
+    => where { $_->isa('Net::FTP') }
+    => message { "Das übergebene Objekt muss vom Typ 'Net::FTP' sein" };
+
+=back
+
+=head1 ATTRIBUTES
+
+Alle durch diese Rolle definierten Attribute
+
+=head2 ftp
+
+Das Net::FTP-Objekt als eigentlicher FTP-Client.
+
+=cut
+
+has 'ftp' => (
+    is              => 'ro',
+    isa             => 'Net::FTP',
+    traits          => [ 'NoGetopt' ],
+    lazy            => 0,
+    clearer         => '_clear_ftp',
+    predicate       => 'has_ftp',
+    writer          => '_set_ftp',
+    documentation   => 'Das Net::FTP-Objekt als eigentlicher FTP-Client.',
+);
+
+#--------------------
+
+sub _set_ftp {
+    return $_[1];
+}
+
+#---------------------------------------------------------------------------
+
+=head2 ftp_connected
+
+Flag, ob der FTP-Client gerade mit dem Server verbunden ist.
+
+=cut
+
+has 'ftp_connected' => (
+    is              => 'ro',
+    isa             => 'Bool',
+    lazy            => 1,
+    traits          => [ 'NoGetopt' ],
+    builder         => '_build_ftp_connected',
+    writer          => '_set_ftp_connected',
+    documentation   => 'BOOL: Flag, ob der FTP-Client gerade mit dem Server verbunden ist.',
+);
+
+#--------------------
+
+sub _build_ftp_connected {
+    return 0;
+}
+
+sub _set_ftp_connected {
+    return $_[1];
+}
+
+#---------------------------------------------------------------------------
+
+=head2 ftp_auto_login
+
+Flag, ob der sich der FTP-Client automatisch anmelden soll, nachdem er initialisiert wurde.
+
+=cut
+
+has 'ftp_auto_login' => (
+    is              => 'rw',
+    isa             => 'Bool',
+    lazy            => 1,
+    traits          => [ 'NoGetopt' ],
+    builder         => '_build_ftp_auto_login',
+    documentation   => 'BOOL: Flag, ob sich der FTP-Client automatisch anmelden soll, nachdem er initialisiert wurde.',
+);
+
+#--------------------
+
+sub _build_ftp_auto_login {
+    return 0;
+}
+
+#---------------------------------------------------------------------------
+
+=head2 ftp_host
+
+Der Hostname oder die IP-Adresse des FTP-Servers
+
+=cut
+
+has 'ftp_host' => (
+    is              => 'rw',
+    isa             => 'Str',
+    traits          => [ 'Getopt' ],
+    lazy            => 1,
+    required        => 1,
+    builder         => '_build_ftp_host',
+    documentation   => 'String: der Hostname oder die IP-Adresse des FTP-Servers',
+    cmd_flag        => 'ftp-host',
+    cmd_aliases     => [ 'H', 'host' ],
+);
+
+#--------------------
+
+sub _build_ftp_host {
+    return 'localhost';
+}
+
+#---------------------------------------------------------------------------
+
+=head2 ftp_user
+
+Der FTP-Nutzername, default zu 'anonymous'.
+
+=cut
+
+has 'ftp_user' => (
+    is              => 'rw',
+    isa             => 'Str',
+    traits          => [ 'Getopt' ],
+    lazy            => 1,
+    required        => 1,
+    builder         => '_build_ftp_user',
+    documentation   => 'String: Nutzername des FTP-Nutzers',
+    cmd_flag        => 'ftp-user',
+    cmd_aliases     => [ 'U', 'user' ],
+);
+
+#--------------------
+
+sub _build_ftp_user {
+    return 'anonymous';
+}
+
+#---------------------------------------------------------------------------
+
+=head2 ftp_password
+
+Das Passwort des FTP-Nutzers
+
+=cut
+
+has 'ftp_password' => (
+    is              => 'rw',
+    isa             => 'Str',
+    traits          => [ 'Getopt' ],
+    lazy            => 1,
+    required        => 1,
+    builder         => '_build_ftp_password',
+    documentation   => 'String: Passort des FTP-Nutzers',
+    cmd_flag        => 'ftp-password',
+    cmd_aliases     => [ 'P', 'password' ],
+);
+
+#--------------------
+
+sub _build_ftp_password {
+    my $email = 'anonymous@' . domainname();
+    return $email;
+}
+
+#---------------------------------------------------------------------------
+
+=head2 ftp_blocksize
+
+Die Blockgröße in Bytes, die Net::FTP für den Datentransfer verwendet.
+
+=cut
+
+has 'ftp_blocksize' => (
+    is              => 'rw',
+    isa             => 'Int',
+    traits          => [ 'Getopt' ],
+    lazy            => 1,
+    required        => 1,
+    builder         => '_build_ftp_blocksize',
+    documentation   => 'Int: die Blockgröße in Bytes, die Net::FTP für den Datentransfer verwendet (default: 10240).',
+    cmd_flag        => 'ftp-blocksize',
+    cmd_aliases     => [ 'blocksize' ],
+);
+
+#--------------------
+
+sub _build_ftp_blocksize {
+    return 10_240;
+}
+
+#---------------------------------------------------------------------------
+
+=head2 ftp_port
+
+Die Portadresse des FTP-Servers.
+
+=cut
+
+has 'ftp_port' => (
+    is              => 'rw',
+    isa             => 'Int',
+    traits          => [ 'Getopt' ],
+    lazy            => 1,
+    required        => 1,
+    builder         => '_build_ftp_port',
+    documentation   => 'Int: die Portadresse des FTP-Servers (default: 21).',
+    cmd_flag        => 'ftp-port',
+    cmd_aliases     => [ 'port', 'P' ],
+);
+
+#--------------------
+
+sub _build_ftp_port {
+    return 21;
+}
+
+#---------------------------------------------------------------------------
+
+=head2 ftp_timeout
+
+Der Timeout in Sekunden für FTP-Prozesse (default: 120)
+
+=cut
+
+has 'ftp_timeout' => (
+    is              => 'rw',
+    isa             => 'Int',
+    traits          => [ 'Getopt' ],
+    lazy            => 1,
+    required        => 1,
+    builder         => '_build_ftp_timeout',
+    documentation   => 'Int: der Timeout in Sekunden für FTP-Prozesse (default: 120).',
+    cmd_flag        => 'ftp-timeout',
+    cmd_aliases     => [ 'timeout', 'T' ],
+);
+
+#--------------------
+
+sub _build_ftp_timeout {
+    return 120;
+}
+
+#---------------------------------------------------------------------------
+
+=head2 ftp_passive
+
+Flag, dass der FTP-Client eine passive FTP-Verbindung zum Server aufbauen soll.
+
+=cut
+
+has 'ftp_passive' => (
+    is              => 'rw',
+    isa             => 'Bool',
+    lazy            => 1,
+    required        => 1,
+    traits          => [ 'Getopt' ],
+    builder         => '_build_ftp_passive',
+    documentation   => 'BOOL: Flag, dass der FTP-Client eine passive FTP-Verbindung zum Server aufbauen soll.',
+    cmd_flag        => 'ftp-passive',
+    cmd_aliases     => [ 'passive' ],
+);
+
+#--------------------
+
+sub _build_ftp_passive {
+    return 0;
+}
+
+#---------------------------------------------------------------------------
+
+=head2 ftp_hash_size
+
+Alle wieviele Bytes soll während der Übertragung ein Hash-Zeichen (#) auf STDERR geschrieben werden,
+wenn $self->ftp_show_hashes auf TRUE gesetzt ist (default: 1024).
+
+=cut
+
+has 'ftp_hash_size' => (
+    is              => 'rw',
+    isa             => 'Int',
+    traits          => [ 'Getopt' ],
+    lazy            => 1,
+    required        => 1,
+    builder         => '_build_ftp_hash_size',
+    documentation   => 'Int: alle wieviele Bytes soll während der Übertragung ein Hash-Zeichen (#) auf STDERR geschrieben werden (default: 1024).',
+    cmd_flag        => 'ftp-hash-size',
+    cmd_aliases     => [ 'hash-size' ],
+);
+
+#--------------------
+
+sub _build_ftp_hash_size {
+    return 1024;
+}
+
+############################################################################
+
+=head1 METHODS
+
+Methoden dieser Rolle
+
+=cut
+
+#---------------------------------------------------------------------------
+
+after 'evaluate_config' => sub {
+
+    my $self = shift;
+
+    $self->debug( "Werte FTP-Konfigurationsdinge aus ..." );
+    return unless $self->config and keys %{ $self->config };
+
+    my @ConfigKeys = qw( host user password blocksize port timeout passive hash_size auto_login );
+
+    for my $key ( keys %{ $self->config } ) {
+
+        my $val = $self->config->{$key};
+
+        for my $p ( @ConfigKeys ) {
+            my $f = 'ftp_' . $p;
+            my $r = $p;
+            $r =~ s/_/\[_-\]\?/g;
+            $r = "^ftp[_\-]?$r\$";
+            $self->debug( sprintf( "Regex 1: '%s'", $r ) ) if $self->verbose >= 2;
+            unless ( self->used_cmd_params->{$f} ) {
+                if ( $key =~ /$r/i ) {
+                    $self->debug( sprintf( "Gefunden: \$self->config->{%s} -> '%s'", $key, $val ) );
+                    $self->$f($val);
+                }
+            }
+        }
+
+    }
+
+    for my $key ( keys %{ $self->config } ) {
+        if ( lc($key) eq 'ftp' and ref( $self->config->{$key} ) and ref( $self->config->{$key} ) eq 'HASH' ) {
+            for my $ftp_key ( keys %{ $self->config->{$key} } ) {
+
+                my $val = $self->config->{$key}{$ftp_key};
+
+                for my $p ( @ConfigKeys ) {
+
+                    my $f = 'ftp_' . $p;
+                    my $r = $p;
+                    $r =~ s/_/\[_-\]\?/g;
+                    $r = "^$r\$";
+                    $self->debug( sprintf( "Regex 2: '%s'", $r ) ) if $self->verbose >= 2;
+
+                    unless ( self->used_cmd_params->{$f} ) {
+                        if ( $ftp_key =~ /$r/i ) {
+                            $self->debug( sprintf( "Gefunden: \$self->config->{%s}{%s} -> '%s'", $key, $ftp_key, $val ) );
+                            $self->$f($val);
+                        }
+                    }
+
+                }
+
+            }
+        }
+    }
+
+};
+
+#---------------------------------------------------------------------------
+
+after 'init_app' => sub {
+
+    my $self = shift;
+
+    $self->debug( "Initialisiere ..." );
+    if ( $self->verbose >= 2 ) {
+
+        my $tmp;
+        for my $f ( 'ftp_connected', 'ftp_auto_login', 'ftp_host', 'ftp_user', 'ftp_password', 'ftp_blocksize', 'ftp_port', 'ftp_timeout', 'ftp_passive', 'ftp_hash_size' ) {
+            $tmp = $self->$f();
+        }
+
+    }
+
+    $self->init_ftp();
+
+};
+
+#---------------------------------------------------------------------------
+
+=head2 init_ftp( )
+
+Initialisiert das Net::FTP-Objekt
+
+=cut
+
+sub init_ftp {
+
+    my $self = shift;
+
+    cluck( "Guck mal: " ) if $self->verbose >= 4;
+    $self->debug( "Initialisiere Net::FTP-Objekt ..." );
+
+    my $ftp_params = {
+        'Host'      => $self->ftp_host,
+        'BlockSize' => $self->ftp_blocksize,
+        'Port'      => $self->ftp_port,
+        'Timeout'   => $self->ftp_timeout,
+        'Debug'     => ( $self->verbose >= 2 ? 1 : 0 ),
+        'Passive'   => $self->ftp_passive,
+    };
+    $self->debug( "Initialisierungs-Parameter FTP: ", $ftp_params ) if $self->verbose >= 2;
+
+    my $ftp = Net::FTP->new( %$ftp_params );
+    unless ( $ftp ) {
+        my $err = $@ || $!;
+        $self->warn( "Fehler bei der Initialisierung des FTP-Objekts: " . $err );
+        return undef;
+    }
+
+    $self->_set_ftp($ftp);
+
+    if ( $self->ftp_auto_login ) {
+        $self->login_ftp();
+    }
+
+    return $ftp;
+
+}
+
+#---------------------------------------------------------------------------
+
+=head2 login_ftp( )
+
+Anmeldung am FTP-Server
+
+=cut
+
+sub login_ftp {
+
+    my $self = shift;
+
+    unless ( $self->ftp ) {
+        my $auto_login = $self->ftp_auto_login;
+        $self->ftp_auto_login(0);
+        $self->init_ftp();
+        $self->ftp_auto_login($auto_login);
+    }
+
+    $self->debug( "Login am FTP-Server ..." );
+
+    unless ( $self->ftp ) {
+        $self->warn( "Kann mich nicht ohne FTP-Server anmelden: ", $! );
+        cluck "Kann mich nicht ohne FTP-Server anmelden: " . $! . "\n" if $self->verbose;
+        return undef;
+    }
+    my $ftp = $self->ftp;
+
+    if ( $ftp->login( $self->ftp_user, $self->ftp_password ) ) {
+        $self->debug( "FTP-Login erfolgreich." );
+        $self->_set_ftp_connected(1);
+        return 1;
+    }
+    else {
+        $self->warn( sprintf( "FTP-Login misslungen: %s", $ftp->message ) );
+    }
+
+    return undef;
+
+}
+
+#---------------------------------------------------------------------------
+
+=head2 logout_ftp( )
+
+Abmeldung am FTP-Server
+
+=cut
+
+sub logout_ftp {
+
+    my $self = shift;
+
+    my $ftp = $self->ftp;
+    unless ( $ftp ) {
+        $self->debug( "Kein FTP-Objekt zum Abmelden da." );
+        return;
+    }
+
+    if ( $self->ftp_connected ) {
+
+        $self->debug( "Abmeldung vom FTP-Server ..." );
+        $ftp->quit;
+        $self->_set_ftp_connected(0);
+
+    }
+
+    $self->_clear_ftp();
+
+}
+
+#---------------------------------------------------------------------------
+
+=head2 DEMOLISH( )
+
+Destruktor
+
+=cut
+
+sub DEMOLISH {
+
+    my $self = shift;
+
+    $self->debug( "Verschwinde ..." );
+    if ( $self->ftp ) {
+        $self->debug( "Selbstzerstörung ..." );  
+        $self->logout_ftp;
+    }
+
+}
+
+#---------------------------------------------------------------------------
+
+no Moose::Role;
+1;
+
+__END__
+
+# vim: noai: filetype=perl ts=4 sw=4 : expandtab