Class-Field

 view release on metacpan or  search on metacpan

README  view on Meta::CPAN


SYNOPSIS

        package Thing;
        use Class::Field qw'field const';
    
        field 'this';
        field 'list' => [];
        field 'map' => {};
        field 'that', -init => '$self->setup_that';
        field 'circular_ref' => -weaken;
        const 'answer' => 42;

DESCRIPTION

    Class::Field exports two subroutines, field and const. These functions
    are used to declare fields and constants in your class.

    Class::Field generates custom code for each accessor that is optimized
    for speed.

lib/Class/Field.pm  view on Meta::CPAN

    sub_start =>
      "sub {\n  local \*__ANON__ = \"%s::%s\";\n",
    set_default =>
      "  \$_[0]->{%s} = %s\n    unless exists \$_[0]->{%s};\n",
    init =>
      "  return \$_[0]->{%s} = do { my \$self = \$_[0]; %s }\n" .
      "    unless \$#_ > 0 or defined \$_[0]->{%s};\n",
    weak_init =>
      "  return do {\n" .
      "    \$_[0]->{%s} = do { my \$self = \$_[0]; %s };\n" .
      "    Scalar::Util::weaken(\$_[0]->{%s}) if ref \$_[0]->{%s};\n" .
      "    \$_[0]->{%s};\n" .
      "  } unless \$#_ > 0 or defined \$_[0]->{%s};\n",
    return_if_get =>
      "  return \$_[0]->{%s} unless \$#_ > 0;\n",
    set =>
      "  \$_[0]->{%s} = \$_[1];\n",
    weaken =>
      "  Scalar::Util::weaken(\$_[0]->{%s}) if ref \$_[0]->{%s};\n",
    sub_end =>
      "  return \$_[0]->{%s};\n}\n",
);

sub field {
    my $package = caller;
    my ($args, @values) = do {
        no warnings;
        local *boolean_arguments = sub { (qw(-weak)) };
        local *paired_arguments = sub { (qw(-package -init)) };
        Class::Field->parse_arguments(@_);
    };
    my ($field, $default) = @values;
    $package = $args->{-package} if defined $args->{-package};
    die "Cannot have a default for a weakened field ($field)"
        if defined $default && $args->{-weak};
    return if defined &{"${package}::$field"};
    require Scalar::Util if $args->{-weak};
    my $default_string =
        ( ref($default) eq 'ARRAY' and not @$default )
        ? '[]'
        : (ref($default) eq 'HASH' and not keys %$default )
          ? '{}'
          : default_as_code($default);

lib/Class/Field.pm  view on Meta::CPAN

        if ($args->{-weak}) {
            $code .= sprintf $code{weak_init}, $field, $args->{-init}, ($field) x 4;
        } else {
            $code .= sprintf $code{init}, $field, $args->{-init}, $field;
        }
    }
    $code .= sprintf $code{set_default}, $field, $default_string, $field
      if defined $default;
    $code .= sprintf $code{return_if_get}, $field;
    $code .= sprintf $code{set}, $field;
    $code .= sprintf $code{weaken}, $field, $field
      if $args->{-weak};
    $code .= sprintf $code{sub_end}, $field;

    my $sub = eval $code;
    die $@ if $@;
    no strict 'refs';
    use utf8;
    my $method = "${package}::$field";
    $method = Encode::decode_utf8($method);
    *{$method} = $sub;

lib/Class/Field.pod  view on Meta::CPAN


=head1 SYNOPSIS

    package Thing;
    use Class::Field qw'field const';

    field 'this';
    field 'list' => [];
    field 'map' => {};
    field 'that', -init => '$self->setup_that';
    field 'circular_ref' => -weaken;
    const 'answer' => 42;

=head1 DESCRIPTION

Class::Field exports two subroutines, C<field> and C<const>. These functions
are used to declare fields and constants in your class.

Class::Field generates custom code for each accessor that is optimized
for speed.



( run in 0.788 second using v1.01-cache-2.11-cpan-65fba6d93b7 )