The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

=head1 TITLE

Stream;Filter - filter and/or alter a stream

=head1 VERSION

version 0.1

=head1 SYNOPSIS

please see F<examples/streams/Filter.pir>

=head1 DESCRIPTION

TBD

=head1 METHODS

=over 4

=cut

.sub onload :load :anon
    .local int i
    .local pmc base
    .local pmc filter

    $P0 = get_class ['Stream'; 'Filter']
    unless null $P0 goto END

    load_bytecode 'Stream/Base.pbc'

    get_class base, ['Stream'; 'Base']
    subclass filter, base, ['Stream'; 'Filter']

    addattribute filter, "filter"
END:
.end

.namespace ['Stream'; 'Filter']

=item source."filter"( filter )

Sets or returns the filter sub.

=cut

.sub filter :method
    .param pmc _filter :optional
    .param int has_filter :opt_flag
    .local pmc ret

    unless has_filter goto GET
    ret = _filter
    setattribute self, 'filter', _filter
    branch END
GET:
    getattribute ret, self, 'filter'
END:
    .return(ret)
.end

=item source."rawRead"() (B<internal>)

...

=cut

.sub rawRead :method
    .local pmc source
    .local pmc filter
    .local string str

    source = self."source"()
    filter = self."filter"()
REDO:
    str = source."read"()
    if_null str, END
    str = filter( str )
    if_null str, REDO
END:
    .return(str)
.end

=back

=head1 AUTHOR

Jens Rieks E<lt>parrot at jensbeimsurfen dot deE<gt> is the author
and maintainer.
Please send patches and suggestions to the Perl 6 Internals mailing list.

=head1 COPYRIGHT

Copyright (C) 2004-2009, Parrot Foundation.

=cut

# Local Variables:
#   mode: pir
#   fill-column: 100
# End:
# vim: expandtab shiftwidth=4 ft=pir: