Class::Dot::Types


Class-Dot documentation Contained in the Class-Dot distribution.

Index


Code Index:

# Local Variables: # mode: cperl # cperl-indent-level: 4 # fill-column: 78 # End: # vim: expandtab tabstop=4 shiftwidth=4 shiftround


Class-Dot documentation Contained in the Class-Dot distribution.

# $Id: Dot.pm 28 2007-10-29 17:35:27Z asksol $
# $Source: /opt/CVS/Getopt-LL/lib/Class/Dot.pm,v $
# $Author: asksol $
# $HeadURL: https://class-dot.googlecode.com/svn/class-dot/lib/Class/Dot.pm $
# $Revision: 28 $
# $Date: 2007-10-29 18:35:27 +0100 (Mon, 29 Oct 2007) $
package Class::Dot::Types;

use strict;
use warnings;
use version qw(qv);
use 5.006000;

use Carp qw(croak);

our $VERSION   = qv('1.5.0');
our $AUTHORITY = 'cpan:ASKSH';

our @STD_TYPES = qw(
    isa_String isa_Int isa_Array isa_Hash
    isa_Data isa_Object isa_Code isa_File
);

my @EXPORT_OK = @STD_TYPES;

my %EXPORT_CLASS = (
   ':std'  => [@EXPORT_OK],
);

our %__TYPEDICT__ = (
   'Array'     => \&isa_Array,
   'Code'      => \&isa_Code,
   'Data'      => \&isa_Data,
   'File'      => \&isa_File,
   'Hash'      => \&isa_Hash,
   'Int'       => \&isa_Int,
   'Object'    => \&isa_Object,
   'String'    => \&isa_String,
);

sub import { ## no critic
    my $this_class   = shift;
    my $caller_class = caller;

    my $export_class;
    my @subs;
    for my $arg (@_) {
        if ($arg =~ m/^:/xms) {
            croak(   'Only one export class can be used. '
                    ."(Used already: [$export_class] now: [$arg])")
                if $export_class;

            $export_class = $arg;
        }
        else {
            push @subs, $arg;
        }
    }

    my @subs_to_export
        = $export_class && $EXPORT_CLASS{$export_class}
        ? (@{ $EXPORT_CLASS{$export_class} }, @subs)
        : @subs;

    no strict 'refs'; ## no critic;
    for my $sub_to_export (@subs_to_export) {
        _install_sub_from_class($this_class, $sub_to_export => $caller_class);
    }

    return;
}

sub _install_sub_from_class {
    my ($pkg_from, $sub_name, $pkg_to) = @_;
    my $from = join q{::}, ($pkg_from, $sub_name);
    my $to   = join q{::}, ($pkg_to,   $sub_name);

    no strict 'refs'; ## no critic
    *{$to} = *{$from};

    return;
}


sub isa_String { ## no critic
    my ($default_value) = @_;

    return sub {
        return $default_value
            if defined $default_value;
        return;
    };
}

sub isa_Int    { ## no critic
    my ($default_value) = @_;

    return sub {
        return $default_value
            if defined $default_value;
        return;
    };
}

sub isa_Array  { ## no critic
    my @default_values = @_;

    return sub {
        return scalar @default_values
            ? \@default_values
            : [ ];
    };
}

sub isa_Hash   { ## no critic
    my %default_values = @_;

    return sub {
        return scalar keys %default_values
            ? \%default_values
            : { };

        # have to test if there are any entries in the hash
        # so we return a new anonymous hash if it ain't.
    };
}

sub isa_Data   { ## no critic
    my ($default_value) = @_;

    return sub {
        return $default_value
            if defined $default_value;
        return;
    };
}

sub isa_Code (;&;) { ## no critic
    my $code_ref = shift;

    return sub {
        return defined $code_ref ? $code_ref : sub { };
    }
}

sub isa_File   { ## no critic
    my $filehandle = shift;
    
    return sub {
        if (defined $filehandle) {
            return $filehandle;
        }
        else {
            require FileHandle;
            return FileHandle->new( );
        }
    }
}

sub isa_Object { ## no critic
    my $class = shift;
    my %opts;
    if (!scalar @_ % 2) {
        %opts = @_;
    }
    return sub {
        return if not defined $class;
        if ($opts{auto}) {
            return        $class->new();
        }
        return;
    };
}

1;

__END__