view release on metacpan or search on metacpan
lib/Catalyst/Plugin/URI.pm view on Meta::CPAN
use base 'Catalyst::Controller';
sub make_a_url :Local {
my ($self, $c) = @_;
my $url = $c->uri("$controller.$action", \@args, \%query, \$fragment);
}
This is just a shortcut with stronger error messages for:
sub make_a_url :Local {
my ($self, $c) = @_;
my $url = $c->url_for(
$c->controller($controller)->action_for($action),
\@args, \%query, \$fragment);
}
=head1 DESCRIPTION
B<NOTE> Starting with version C<0.003> I changed that way this works. If you want
lib/Catalyst/Plugin/URI.pm view on Meta::CPAN
Currently if you want to create a URL to a controller's action properly the formal
syntax is rather verbose:
my $url = $c->uri(
$c->controller($controller)->action_for($action),
\@args, \%query, \$fragment);
Which is verbose enough that it probably encourages people to do the wrong thing
and use a hard coded link path. This might later bite you if you need to change
your controllers and URL hierarchy.
lib/Catalyst/Plugin/URI.pm view on Meta::CPAN
=head2 uri
Example:
$c->uri("$controller:$action", \@parts, \%query, \$fragment);
This is a sugar method which works the same as:
my $url = $c->uri_for(
$c->controller($controller)->action_for($action),
\@args, \%query, \$fragment);
Just a bit shorter, and also we check to make sure the $controller and
$action actually exist (and raise a hard fail if they don't with an error
message that is I think more clear than the longer version.
You can also use a 'relative' specification for the action, which assumes
the current controller. For example:
$c->uri(":$action", \@parts, \%query, \$fragment);
Basically the same as:
my $url = $c->uri_for(
$self->action_for($action),
\@args, \%query, \$fragment);
We also support a corrected version of what 'uri_for_action' meant to achieve:
$c->uri("$action", @args);
view all matches for this distribution
view release on metacpan or search on metacpan
inc/Spiffy.pm view on Meta::CPAN
? '{}'
: default_as_code($default);
my $code = $code{sub_start};
if ($args->{-init}) {
my $fragment = $args->{-weak} ? $code{weak_init} : $code{init};
$code .= sprintf $fragment, $field, $args->{-init}, ($field) x 4;
}
$code .= sprintf $code{set_default}, $field, $default_string, $field
if defined $default;
$code .= sprintf $code{return_if_get}, $field;
$code .= sprintf $code{set}, $field;
view all matches for this distribution
view release on metacpan or search on metacpan
inc/Module/AutoInstall.pm view on Meta::CPAN
return 1;
}
sub postamble {
$PostambleUsed = 1;
my $fragment;
$fragment .= <<"AUTO_INSTALL" if !$InstallDepsTarget;
config :: installdeps
\t\$(NOECHO) \$(NOOP)
AUTO_INSTALL
$fragment .= <<"END_MAKE";
checkdeps ::
\t\$(PERL) $0 --checkdeps
installdeps ::
inc/Module/AutoInstall.pm view on Meta::CPAN
listalldeps ::
\t$PostambleActionsListAllDeps
END_MAKE
return $fragment;
}
1;
__END__
view all matches for this distribution
view release on metacpan or search on metacpan
lib/Catalyst/Plugin/Widget.pm view on Meta::CPAN
package Catalyst::Plugin::Widget;
=head1 NAME
Catalyst::Plugin::Widget - Simple way to create reusable HTML fragments
=head1 VERSION
Version 0.04
view all matches for this distribution
view release on metacpan or search on metacpan
lib/Catalyst.pm view on Meta::CPAN
sub setup_finalize {
my ($class) = @_;
$class->setup_finished(1);
}
=head2 $c->uri_for( $path?, @args?, \%query_values?, \$fragment? )
=head2 $c->uri_for( $action, \@captures?, @args?, \%query_values?, \$fragment? )
=head2 $c->uri_for( $action, [@captures, @args], \%query_values?, \$fragment? )
Constructs an absolute L<URI> object based on the application root, the
provided path, and the additional arguments and query parameters provided.
When used as a string, provides a textual URI. If you need more flexibility
than this (i.e. the option to provide relative URIs etc.) see
lib/Catalyst.pm view on Meta::CPAN
B<NOTE> If you are using this 'stringy' first argument, we skip encoding and
allow you to declare something like:
$c->uri_for('/foo/bar#baz')
Where 'baz' is a URI fragment. We consider this first argument string to be
'expert' mode where you are expected to create a valid URL and we for the most
part just pass it through without a lot of internal effort to escape and encode.
If the first argument is a L<Catalyst::Action> it represents an action which
will have its path resolved using C<< $c->dispatcher->uri_for_action >>. The
lib/Catalyst.pm view on Meta::CPAN
$path = $path->path_prefix;
$path =~ s{/+\z}{};
$path .= '/';
}
my $fragment = ((scalar(@args) && ref($args[-1]) eq 'SCALAR') ? ${pop @args} : undef );
unless(blessed $path) {
if (defined($path) and $path =~ s/#(.+)$//) {
if(defined($1) and defined $fragment) {
carp "Abiguious fragment declaration: You cannot define a fragment in '$path' and as an argument '$fragment'";
}
if(defined($1)) {
$fragment = $1;
}
}
}
my $params =
lib/Catalyst.pm view on Meta::CPAN
$base = encode_utf8 $base;
$base =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;
$args = encode_utf8 $args;
$args =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;
if(defined $fragment) {
if(blessed $path) {
$fragment = encode_utf8($fragment);
$fragment =~ s/([^A-Za-z0-9\-_.!~*'() ])/$URI::Escape::escapes{$1}/go;
$fragment =~ s/ /+/g;
}
$query .= "#$fragment";
}
my $res = bless(\"${base}${args}${query}", $class);
$res;
}
view all matches for this distribution
view release on metacpan or search on metacpan
inc/Module/AutoInstall.pm view on Meta::CPAN
return 1;
}
sub postamble {
$PostambleUsed = 1;
my $fragment;
$fragment .= <<"AUTO_INSTALL" if !$InstallDepsTarget;
config :: installdeps
\t\$(NOECHO) \$(NOOP)
AUTO_INSTALL
$fragment .= <<"END_MAKE";
checkdeps ::
\t\$(PERL) $0 --checkdeps
installdeps ::
inc/Module/AutoInstall.pm view on Meta::CPAN
listalldeps ::
\t$PostambleActionsListAllDeps
END_MAKE
return $fragment;
}
1;
__END__
view all matches for this distribution
view release on metacpan or search on metacpan
lib/Catalyst/View/BasePerRequest.pm view on Meta::CPAN
templating system.
This approach has the upside of being very simple to understand and in general works
ok with a simple websites. There are however downsides as your site becomes more
complex. First of all the stash as a means to pass data from the Controller to the
template can be fragile. For example just making a simple typo in the stash key
can break your templates in ways that might not be easy to figure out. Also your
template can't enforce its requirements very easily (and it's not easy for someone
working in the controller to know exactly what things need to go into the stash in
order for the template to function as desired.) The view itself has no way of
providing view / display oriented logic; generally that logic ends up creeping back up
view all matches for this distribution
view release on metacpan or search on metacpan
1.100
- Refactor into a Moose Role for use with alternate views. (rafl)
- Additional documentation (t0m)
- Clone request headers rather than changing them (t0m)
1.004
- Nick the OSX fragment out of the Catalyst::Runtime Makefile.PL to
beat my Mac into generating a correct dist. (t0m)
1.003
- Fixes an tests to be fully Internet Explorer compatible (David Dorward)
- Change to MRO::Compat for perl 5.10 (t0m)
1.002 2008-12-13
view all matches for this distribution
view release on metacpan or search on metacpan
inc/Module/AutoInstall.pm view on Meta::CPAN
return 1;
}
sub postamble {
$PostambleUsed = 1;
my $fragment;
$fragment .= <<"AUTO_INSTALL" if !$InstallDepsTarget;
config :: installdeps
\t\$(NOECHO) \$(NOOP)
AUTO_INSTALL
$fragment .= <<"END_MAKE";
checkdeps ::
\t\$(PERL) $0 --checkdeps
installdeps ::
inc/Module/AutoInstall.pm view on Meta::CPAN
listalldeps ::
\t$PostambleActionsListAllDeps
END_MAKE
return $fragment;
}
1;
__END__
view all matches for this distribution
view release on metacpan or search on metacpan
inc/Spiffy.pm view on Meta::CPAN
? '{}'
: default_as_code($default);
my $code = $code{sub_start};
if ($args->{-init}) {
my $fragment = $args->{-weak} ? $code{weak_init} : $code{init};
$code .= sprintf $fragment, $field, $args->{-init}, ($field) x 4;
}
$code .= sprintf $code{set_default}, $field, $default_string, $field
if defined $default;
$code .= sprintf $code{return_if_get}, $field;
$code .= sprintf $code{set}, $field;
view all matches for this distribution
view release on metacpan or search on metacpan
inc/Module/AutoInstall.pm view on Meta::CPAN
return 1;
}
sub postamble {
$PostambleUsed = 1;
my $fragment;
$fragment .= <<"AUTO_INSTALL" if !$InstallDepsTarget;
config :: installdeps
\t\$(NOECHO) \$(NOOP)
AUTO_INSTALL
$fragment .= <<"END_MAKE";
checkdeps ::
\t\$(PERL) $0 --checkdeps
installdeps ::
inc/Module/AutoInstall.pm view on Meta::CPAN
listalldeps ::
\t$PostambleActionsListAllDeps
END_MAKE
return $fragment;
}
1;
__END__
view all matches for this distribution
view release on metacpan or search on metacpan
lib/Catalyst/View/JSON.pm view on Meta::CPAN
server response Content-Type. This works transparently with
Catalyst::View::JSON.
Prototype.js: prototype.js will auto-eval JSON data that is
returned in the custom X-JSON header. The reason given for this is
to allow a separate HTML fragment in the response body, however
this of limited use because IE 6 has a max header length that will
cause the JSON evaluation to silently fail when reached. The
recommend approach is to use Catalyst::View::JSON which will JSON
format all the response data and return it in the response body.
view all matches for this distribution
view release on metacpan or search on metacpan
inc/Spiffy.pm view on Meta::CPAN
? '{}'
: default_as_code($default);
my $code = $code{sub_start};
if ($args->{-init}) {
my $fragment = $args->{-weak} ? $code{weak_init} : $code{init};
$code .= sprintf $fragment, $field, $args->{-init}, ($field) x 4;
}
$code .= sprintf $code{set_default}, $field, $default_string, $field
if defined $default;
$code .= sprintf $code{return_if_get}, $field;
$code .= sprintf $code{set}, $field;
view all matches for this distribution
view release on metacpan or search on metacpan
lib/Catalyst/View/TT.pm view on Meta::CPAN
To use the render method outside of your Catalyst app, just pass a undef context.
This can be useful for tests, for instance.
It is possible to forward to the render method of a TT view from inside Catalyst
to render page fragments like this:
my $fragment = $c->forward("View::Web", "render", $template_name, $c->stash->{fragment_data});
=head3 Backwards compatibility note
The render method used to just return the Template::Exception object, rather
than just throwing it. This is now deprecated and instead the render method
view all matches for this distribution
view release on metacpan or search on metacpan
inc/Module/AutoInstall.pm view on Meta::CPAN
return 1;
}
sub postamble {
$PostambleUsed = 1;
my $fragment;
$fragment .= <<"AUTO_INSTALL" if !$InstallDepsTarget;
config :: installdeps
\t\$(NOECHO) \$(NOOP)
AUTO_INSTALL
$fragment .= <<"END_MAKE";
checkdeps ::
\t\$(PERL) $0 --checkdeps
installdeps ::
inc/Module/AutoInstall.pm view on Meta::CPAN
listalldeps ::
\t$PostambleActionsListAllDeps
END_MAKE
return $fragment;
}
1;
__END__
view all matches for this distribution
view release on metacpan or search on metacpan
lib/Catalyst/View/Template/Pure.pm view on Meta::CPAN
$self->{pure}->process_root($dom->root, $data);
$t->encoded_string($self->render($data));
};
}
sub style_fragment { shift->{pure}->style_fragment }
sub script_fragment { shift->{pure}->script_fragment }
sub ctx { return shift->{ctx} }
sub process {
my ($self, $c, @args) = @_;
$self->response(200, @args);
view all matches for this distribution
view release on metacpan or search on metacpan
lib/Catalyst/Helper/View/Text/Template.pm view on Meta::CPAN
Ricardo Signes <rjbs@cpan.org>
=item *
Dean Hamstead <dean@fragfest.com.au>
=back
=head1 COPYRIGHT AND LICENSE
view all matches for this distribution
view release on metacpan or search on metacpan
inc/Module/AutoInstall.pm view on Meta::CPAN
return 1;
}
sub postamble {
$PostambleUsed = 1;
my $fragment;
$fragment .= <<"AUTO_INSTALL" if !$InstallDepsTarget;
config :: installdeps
\t\$(NOECHO) \$(NOOP)
AUTO_INSTALL
$fragment .= <<"END_MAKE";
checkdeps ::
\t\$(PERL) $0 --checkdeps
installdeps ::
inc/Module/AutoInstall.pm view on Meta::CPAN
listalldeps ::
\t$PostambleActionsListAllDeps
END_MAKE
return $fragment;
}
1;
__END__
view all matches for this distribution
view release on metacpan or search on metacpan
inc/Module/AutoInstall.pm view on Meta::CPAN
return 1;
}
sub postamble {
$PostambleUsed = 1;
my $fragment;
$fragment .= <<"AUTO_INSTALL" if !$InstallDepsTarget;
config :: installdeps
\t\$(NOECHO) \$(NOOP)
AUTO_INSTALL
$fragment .= <<"END_MAKE";
checkdeps ::
\t\$(PERL) $0 --checkdeps
installdeps ::
inc/Module/AutoInstall.pm view on Meta::CPAN
listalldeps ::
\t$PostambleActionsListAllDeps
END_MAKE
return $fragment;
}
1;
__END__
view all matches for this distribution
view release on metacpan or search on metacpan
inc/Module/AutoInstall.pm view on Meta::CPAN
return 1;
}
sub postamble {
$PostambleUsed = 1;
my $fragment;
$fragment .= <<"AUTO_INSTALL" if !$InstallDepsTarget;
config :: installdeps
\t\$(NOECHO) \$(NOOP)
AUTO_INSTALL
$fragment .= <<"END_MAKE";
checkdeps ::
\t\$(PERL) $0 --checkdeps
installdeps ::
inc/Module/AutoInstall.pm view on Meta::CPAN
listalldeps ::
\t$PostambleActionsListAllDeps
END_MAKE
return $fragment;
}
1;
__END__
view all matches for this distribution
view release on metacpan or search on metacpan
lib/CatalystX/Crudite/Util/Random.pm view on Meta::CPAN
fractions
fracture
fractured
fractures
fracturing
fragile
fragment
fragmentary
fragmentation
fragmented
fragmenting
fragments
fragrance
fragrances
fragrant
fragrantly
frail
frailest
frailty
frame
framed
lib/CatalystX/Crudite/Util/Random.pm view on Meta::CPAN
reformulation
refract
refracted
refraction
refractory
refragment
refrain
refrained
refraining
refrains
refresh
lib/CatalystX/Crudite/Util/Random.pm view on Meta::CPAN
suffocated
suffocates
suffocating
suffocation
Suffolk
suffrage
suffragette
sugar
sugared
sugaring
sugarings
sugars
view all matches for this distribution
view release on metacpan or search on metacpan
lib/CatalystX/Declare.pm view on Meta::CPAN
controller roles.
=head2 Not a Source Filter
The used syntax elements are not parsed via source filter mechanism, but
through L<Devel::Declare>, which is a much less fragile deal to handle and
allows extensions to mix without problems. For example, all keywords added
by this module are separete handlers.
=head2 Syntax Documentation
view all matches for this distribution
view release on metacpan or search on metacpan
inc/Module/AutoInstall.pm view on Meta::CPAN
return 1;
}
sub postamble {
$PostambleUsed = 1;
my $fragment;
$fragment .= <<"AUTO_INSTALL" if !$InstallDepsTarget;
config :: installdeps
\t\$(NOECHO) \$(NOOP)
AUTO_INSTALL
$fragment .= <<"END_MAKE";
checkdeps ::
\t\$(PERL) $0 --checkdeps
installdeps ::
inc/Module/AutoInstall.pm view on Meta::CPAN
listalldeps ::
\t$PostambleActionsListAllDeps
END_MAKE
return $fragment;
}
1;
__END__
view all matches for this distribution
view release on metacpan or search on metacpan
inc/Module/AutoInstall.pm view on Meta::CPAN
return 1;
}
sub postamble {
$PostambleUsed = 1;
my $fragment;
$fragment .= <<"AUTO_INSTALL" if !$InstallDepsTarget;
config :: installdeps
\t\$(NOECHO) \$(NOOP)
AUTO_INSTALL
$fragment .= <<"END_MAKE";
checkdeps ::
\t\$(PERL) $0 --checkdeps
installdeps ::
inc/Module/AutoInstall.pm view on Meta::CPAN
listalldeps ::
\t$PostambleActionsListAllDeps
END_MAKE
return $fragment;
}
1;
__END__
view all matches for this distribution
view release on metacpan or search on metacpan
inc/Module/AutoInstall.pm view on Meta::CPAN
return 1;
}
sub postamble {
$PostambleUsed = 1;
my $fragment;
$fragment .= <<"AUTO_INSTALL" if !$InstallDepsTarget;
config :: installdeps
\t\$(NOECHO) \$(NOOP)
AUTO_INSTALL
$fragment .= <<"END_MAKE";
checkdeps ::
\t\$(PERL) $0 --checkdeps
installdeps ::
inc/Module/AutoInstall.pm view on Meta::CPAN
listalldeps ::
\t$PostambleActionsListAllDeps
END_MAKE
return $fragment;
}
1;
__END__
view all matches for this distribution
view release on metacpan or search on metacpan
inc/Module/AutoInstall.pm view on Meta::CPAN
return 1;
}
sub postamble {
$PostambleUsed = 1;
my $fragment;
$fragment .= <<"AUTO_INSTALL" if !$InstallDepsTarget;
config :: installdeps
\t\$(NOECHO) \$(NOOP)
AUTO_INSTALL
$fragment .= <<"END_MAKE";
checkdeps ::
\t\$(PERL) $0 --checkdeps
installdeps ::
inc/Module/AutoInstall.pm view on Meta::CPAN
listalldeps ::
\t$PostambleActionsListAllDeps
END_MAKE
return $fragment;
}
1;
__END__
view all matches for this distribution
view release on metacpan or search on metacpan
t/pica.json view on Meta::CPAN
[{"_id":"658700774","record":[["001@","","0","703"],["001A","","0","2045:10-03-11"],["001B","","0","2045:09-04-13","t","18:26:39.000"],["001D","","0","2045:14-05-11"],["001U","","0","utf8"],["001X","","0","0","x","","y",""],["002@","","0","Oax"],["00...
view all matches for this distribution
view release on metacpan or search on metacpan
{"leader":"01470nam^a22004451^^4500","fields":[{"001":"000000040"},{"005":"19880715000000.0"},{"006":"m^^^^^^^^d^^^^^^^^"},{"007":"cr^bn^---auaua"},{"008":"880715s1968^^^^nyuae^^^^b^^^|00100^eng^^"},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"68...
{"leader":"01593nam^a22004451^^4500","fields":[{"001":"000000212"},{"005":"20031119000000.0"},{"006":"m^^^^^^^^d^^^^^^^^"},{"007":"cr^bn^---auaua"},{"008":"880715s1969^^^^mauae^^^^bc^^|00100^eng^^"},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"79...
{"leader":"01426nam^a22003971^^4500","fields":[{"001":"000000250"},{"005":"20060630100341.0"},{"006":"m^^^^^^^^d^^^^^^^^"},{"007":"cr^bn^---auaua"},{"008":"880715s1969^^^^nyua^^^^^b^^^|00000^eng^^"},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"69...
{"leader":"01440nam^a22004451^^4500","fields":[{"001":"000000310"},{"005":"19981110000000.0"},{"006":"m^^^^^^^^d^^^^^^^^"},{"007":"cr^bn^---auaua"},{"008":"880715s1969^^^^gh^abe^^^b^^^|00000^eng^^"},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"75...
{"leader":"01597nam^a22004811^^4500","fields":[{"001":"000000338"},{"005":"19880715000000.0"},{"006":"m^^^^^^^^d^^^^^^^^"},{"007":"cr^bn^---auaua"},{"008":"880715s1969^^^^nyua^^^^^b^^^|00000^eng^^"},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"77...
{"leader":"01531nam^a22004331^^4500","fields":[{"001":"000000385"},{"005":"19880715000000.0"},{"006":"m^^^^^^^^d^^^^^^^^"},{"007":"cr^bn^---auaua"},{"008":"880715r1967^^^^enkaf^^^^^^^^|00000^eng^^"},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"70...
{"leader":"01318nam^a22004331^^4500","fields":[{"001":"000000396"},{"005":"19880715000000.0"},{"006":"m^^^^^^^^d^^^^^^^^"},{"007":"cr^bn^---auaua"},{"008":"880715s1968^^^^enka^^^^^^^^^^00000^eng^^"},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"74...
{"leader":"01921nam^a22004931^^4500","fields":[{"001":"000000499"},{"005":"19880715000000.0"},{"006":"m^^^^^^^^d^^^^^^^^"},{"007":"cr^bn^---auaua"},{"008":"880715s1969^^^^nyuabe^^^b^^^^00110^eng^^"},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"69...
{"leader":"01692nam^a22004931^^4500","fields":[{"001":"000000719"},{"005":"20010330000000.0"},{"006":"m^^^^^^^^d^^^^^^^^"},{"007":"cr^bn^---auaua"},{"008":"880715s1969^^^^nyuac^^^^^^^^|00100^eng^^"},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"78...
view all matches for this distribution
view release on metacpan or search on metacpan
lib/Catmandu/MediaHaven.pm view on Meta::CPAN
my $result = $mh->search('nature', start => 0 , num => 100);
die "search failed" unless defined($result);
for my $res (@{$result->{mediaDataList}}) {
my $id = $res->{fragmentId};
my $date = $res->{data};
print "$id $date\n";
}
lib/Catmandu/MediaHaven.pm view on Meta::CPAN
unless ($record) {
$self->log->error("no such record $id");
return undef;
}
my $fragmentId = $record->{fragmentId};
my @param;
for (@values) {
push @param , 'value' , $_;
}
my $res = $self->_rest_post("$fragmentId/$field", @param);
return $res;
}
=head2 export($id, $callback)
lib/Catmandu/MediaHaven.pm view on Meta::CPAN
$self->_get_json($media_url);
}
sub _rest_post {
my ($self,$fragment,@param) = @_;
my $media_url = $self->_rest_base .
'/' .
$fragment;
$self->_post_json($media_url,\@param);
}
=head1 MODULES
view all matches for this distribution
view release on metacpan or search on metacpan
lib/Catmandu/Fix/Has.pm view on Meta::CPAN
=over 4
=item fix_arg
Required argument when set to 1. The Fix containing the code fragment below needs
two arguments.
use Catmandu::Fix::Has;
has message => (fix_arg => 1); # required parameter 1
has number => (fix_arg => 1); # required parameter 2
When the fix_arg is set to 'collect', then all arguments are read into an
array. The Fix containing the code fragment below needs at least 1 or more
arguments. All arguments will get collected into the C<messages> array:
use Catmandu::Fix::Has;
has messages => (fix_arg => 'collect'); # required parameter
=item fix_opt
Optional named argument when set to 1. The Fix containing the code fragment
below can have two optional arguments C<message: ...>, C<number: ...>:
use Catmandu::Fix::Has;
has message => (fix_opt => 1); # optional parameter 1
has number => (fix_opt => 1); # optional parameter 2
When the fix_opt is set to 'collect', then all optional argument are read into
an array. The Fix containing the code fragment below needs at least 1 or more
arguments. All arguments will get collected into the C<options> array:
use Catmandu::Fix::Has;
has options => (fix_opt => 'collect'); # optional parameter
view all matches for this distribution