NAME

    Object::Pad::FieldAttr::Checked - apply type constraint checks to
    Object::Pad fields

SYNOPSIS

       TODO

DESCRIPTION

    This module provides a third-party field attribute for
    Object::Pad-based classes, which declares that values assigned to the
    field must conform to a given value constraint check.

    WARNING The ability for Object::Pad to take third-party field
    attributes is still new and highly experimental, and subject to much
    API change in future. As a result, this module should be considered
    equally experimental.

FIELD ATTRIBUTES

 :Checked

       field $name :Checked(EXPRESSION) ...;

    Declares that any value assigned to the field must conform to the
    constraint checking object specified by the expression. Attempts to
    assign a non-conforming value will throw an exception and the field
    will not be modified.

    At compiletime, the string given by EXPRESSION is eval()'ed in scalar
    context, and its result is stored as part of the field's definition.
    The value of the expression must either be an object reference, or a
    string containing the name of a package. In either case, a method
    called check must exist on it.

    At runtime, this constraint checking value is used every time an
    attempt is made to assign a new value to the field, whether that is
    from :param initialisation, invoking a :writer or :mutator accessor, or
    direct assignment into the field variable by method code within the
    class. The checker is used as the invocant for invoking a check method,
    and the new value for the field is passed as an argument. If the method
    returns true, the assignment is allowed. If false, it is rejected with
    an exception and the field itself remains unmodified.

       $ok = $checker->check( $value );

    As this is the interface supported by Types::Standard, any constraint
    object provided by that module is already supported here.

       use Types::Standard qw( Str Num );
    
       field $name :Checked(Str);
       field $age  :Checked(Num);

TODO

      * Consider caching the result of the check method lookup.

AUTHOR

    Paul Evans <leonerd@leonerd.org.uk>

