class HTML_OUTPUT_STREAM
Summary
Highly tailored filter that outputs well-formed HTML. Be aware that you cannot add any character as you want. You can filter this stream, but keep it available because it controls the tags.
Direct parents
Inherit list: FILTER_OUTPUT_STREAM
Class invariant
Overview
Creation features
{ANY}
Features
CGI extensions: written before the HTML itself is open
{ANY}
Main HTML structure
{ANY}
{ANY}
Attributes management
{ANY}
  • attributes: STRING
    Because there are so many attributes for each tag, we did not want features with scores of parameters.%
  • with_attribute (name: STRING, value: STRING)
    Call this feature before adding an opening tag; all the attributes will be added to the tag.
{HTML_HANDLER}
{FILTER_OUTPUT_STREAM}
Putting characters
{ANY}
{ANY}
Header tags
{ANY}
Frames
{ANY}
Body tags
{ANY}
Forms
{ANY}
{}
State queries
{ANY}
States
{}
Send to the underlying stream
{}
{}
{ANY}
{}
Once strings
{}
{ANY}
  • disconnect
    Disconnect from the underlying stream.
{STREAM}
  • do_detach
    Used by the underlying stream to require not to be filtered anymore
{}
{ANY}
{FILTER}
{ANY}
{}
{ANY}
{}
{STREAM_HANDLER}
{FILTER}
{ANY}
{}
{RECYCLING_POOL}
  • recycle
    Do whatever needs to be done to free resources or recycle other objects when recycling this one
{}
  • dispose
    Action to be executed just before garbage collection reclaims an object.
{}
{ANY}
{ABSTRACT_STRING}
{ANY}
To write a number:
{ANY}
Other features:
{ANY}
{}
{}
{FILTER}
put_cgi_header (key: STRING, value: STRING)
effective procedure
{ANY}
require
  • not started
  • key /= Void
  • value /= Void
ensure
header
effective procedure
{ANY}
require ensure
body
effective procedure
{ANY}
require ensure
frames
effective procedure
{ANY}
require ensure
close
effective procedure
{ANY}
require ensure
last_tag: STRING
effective function
{ANY}
require ensure
  • Result /= Void
has_open_tag: BOOLEAN
effective function
{ANY}
attributes: STRING
writable attribute
{ANY}
Because there are so many attributes for each tag, we did not want features with scores of parameters.%
So, we decided to have a general-purpose with_attribute feature to be called before a tag creation.
Typical use:
html_out.with_attribute(once "width", once "80%) html_out.with_attribute(once "align", once "center") html_out.with_attribute(once "valign", once "top") html_out.open_table_cell d
with_attribute (name: STRING, value: STRING)
effective procedure
{ANY}
Call this feature before adding an opening tag; all the attributes will be added to the tag.
open_tag (tag: STRING)
effective procedure
ensure
open_close_tag (tag: STRING)
effective procedure
ensure
close_tag (tag: STRING)
effective procedure
require ensure
put_filtered_string (string: STRING)
effective procedure
filtered_put_character (c: CHARACTER)
effective procedure
require
  • is_connected
  • can_put_character(c)
filtered_flush
effective procedure
require
  • is_connected
can_put_character (c: CHARACTER): BOOLEAN
effective function
{ANY}
put_entity (entity: STRING)
effective procedure
{ANY}
require
  • started
  • not finished
  • not entity.has(';')
  • not entity.has('&')
  • not entity.has('<')
  • not entity.has('>')
put_comment (comment: STRING)
effective procedure
{ANY}
indent
effective procedure
{ANY}
require
put_base (base: STRING)
effective procedure
{ANY}
require
put_meta (equiv: STRING, content: STRING)
effective procedure
{ANY}
require
put_stylesheet (ref: STRING)
effective procedure
{ANY}
require
put_javascript (ref: STRING)
effective procedure
{ANY}
require
open_title
effective procedure
{ANY}
require
close_title
effective procedure
{ANY}
require
put_script (language: STRING, source: STRING)
effective procedure
{ANY}
require
open_script (language: STRING)
effective procedure
{ANY}
require
close_script
effective procedure
{ANY}
require
open_noscript
effective procedure
{ANY}
require
close_noscript
effective procedure
{ANY}
require
open_style
effective procedure
{ANY}
require
close_style
effective procedure
{ANY}
require
open_frameset
effective procedure
{ANY}
require ensure
close_frameset
effective procedure
{ANY}
require ensure
put_frame (src: STRING, name: STRING)
effective procedure
{ANY}
require ensure
open_noframes
effective procedure
{ANY}
require ensure
close_noframes
effective procedure
{ANY}
require ensure
open_section
effective procedure
{ANY}
require
close_section
effective procedure
{ANY}
require
open_subsection
effective procedure
{ANY}
require
close_subsection
effective procedure
{ANY}
require
open_subsubsection
effective procedure
{ANY}
require
close_subsubsection
effective procedure
{ANY}
require
put_break
effective procedure
{ANY}
require
put_horizontal_rule
effective procedure
{ANY}
require
put_image (source: STRING)
effective procedure
{ANY}
require
open_bold
effective procedure
{ANY}
close_bold
effective procedure
{ANY}
require
open_font (size: STRING)
effective procedure
{ANY}
close_font
effective procedure
{ANY}
open_italics
effective procedure
{ANY}
close_italics
effective procedure
{ANY}
require
open_underlined
effective procedure
{ANY}
close_underlined
effective procedure
{ANY}
require
open_typeset
effective procedure
{ANY}
close_typeset
effective procedure
{ANY}
require
open_anchor_address (ref: STRING, target: STRING)
effective procedure
{ANY}
require
open_anchor_name (ref: STRING)
effective procedure
{ANY}
require
open_anchor
effective procedure
{ANY}
close_anchor
effective procedure
{ANY}
require
open_list
effective procedure
{ANY}
require ensure
open_numbered_list
effective procedure
{ANY}
require ensure
close_list
effective procedure
{ANY}
require ensure
open_definition_list
effective procedure
{ANY}
require ensure
close_definition_list
effective procedure
{ANY}
require ensure
open_definition_term
effective procedure
{ANY}
close_definition_term
effective procedure
{ANY}
open_definition_description
effective procedure
{ANY}
close_definition_description
effective procedure
{ANY}
open_list_item
effective procedure
{ANY}
require ensure
close_list_item
effective procedure
{ANY}
require ensure
open_table
effective procedure
{ANY}
require ensure
close_table
effective procedure
{ANY}
require ensure
open_table_row
effective procedure
{ANY}
require ensure
close_table_row
effective procedure
{ANY}
require ensure
open_table_cell
effective procedure
{ANY}
require ensure
close_table_cell
effective procedure
{ANY}
require ensure
open_form (name: STRING, method: STRING, action: STRING)
effective procedure
{ANY}
require ensure
close_form
effective procedure
{ANY}
require
open_text_area (name: STRING, rows: INTEGER_32, cols: INTEGER_32)
effective procedure
{ANY}
require ensure
close_text_area
effective procedure
{ANY}
require
put_button (name: STRING, title: STRING)
effective procedure
{ANY}
require
put_validate_button (name: STRING, title: STRING)
effective procedure
{ANY}
require
put_reset_button (name: STRING, title: STRING)
effective procedure
{ANY}
require
put_hidden_field (name: STRING, value: STRING)
effective procedure
{ANY}
require
put_text_field (name: STRING, value: STRING)
effective procedure
{ANY}
require
put_password_field (name: STRING, value: STRING)
effective procedure
{ANY}
require
put_radio_button (name: STRING, value: STRING, checked: BOOLEAN)
effective procedure
{ANY}
require
put_check_box (name: STRING, value: STRING, checked: BOOLEAN)
effective procedure
{ANY}
require
open_combo_select (name: STRING)
effective procedure
{ANY}
require ensure
open_multiple_select (name: STRING, size: INTEGER_32)
effective procedure
{ANY}
require ensure
close_select
effective procedure
{ANY}
require ensure
open_option (value: STRING)
effective procedure
{ANY}
require ensure
close_option
effective procedure
{ANY}
require ensure
open_paragraph
effective procedure
{ANY}
require ensure
close_paragraph
effective procedure
{ANY}
require ensure
open_preformatted
effective procedure
{ANY}
require ensure
close_preformatted
effective procedure
{ANY}
require
open_blockquote
effective procedure
{ANY}
require ensure
close_blockquote
effective procedure
{ANY}
require ensure
open_div
effective procedure
{ANY}
require ensure
close_div
effective procedure
{ANY}
require ensure
open_span
effective procedure
{ANY}
require ensure
close_span
effective procedure
{ANY}
require ensure
put_input (type: STRING, name: STRING, value: STRING, checked: BOOLEAN)
effective procedure
{}
started: BOOLEAN
effective function
{ANY}
finished: BOOLEAN
effective function
{ANY}
in_header: BOOLEAN
effective function
{ANY}
in_script: BOOLEAN
effective function
{ANY}
in_noscript: BOOLEAN
effective function
{ANY}
in_style: BOOLEAN
effective function
{ANY}
in_body: BOOLEAN
effective function
{ANY}
in_list: BOOLEAN
effective function
{ANY}
in_list_item: BOOLEAN
effective function
{ANY}
in_table: BOOLEAN
effective function
{ANY}
in_table_row: BOOLEAN
effective function
{ANY}
in_table_cell: BOOLEAN
effective function
{ANY}
in_form: BOOLEAN
effective function
{ANY}
in_select: BOOLEAN
effective function
{ANY}
in_option: BOOLEAN
effective function
{ANY}
in_frames: BOOLEAN
effective function
{ANY}
in_frameset: BOOLEAN
effective function
{ANY}
in_noframes: BOOLEAN
effective function
{ANY}
in_a_body: BOOLEAN
effective function
{ANY}
in_a_form: BOOLEAN
effective function
{ANY}
in_text_area: BOOLEAN
effective function
{ANY}
in_paragraph: BOOLEAN
effective function
{ANY}
in_blockquote: BOOLEAN
effective function
{ANY}
in_div: BOOLEAN
effective function
{ANY}
in_preformatted: BOOLEAN
effective function
{ANY}
in_span: BOOLEAN
effective function
{ANY}
in_definition_list: BOOLEAN
effective function
{ANY}
in_definition_description: BOOLEAN
effective function
{ANY}
in_definition_term: BOOLEAN
effective function
{ANY}
state: INTEGER_32
effective function
{}
set_state (a_state: INTEGER_32)
effective procedure
{}
ensure
reset_state (a_state: INTEGER_32)
effective procedure
{}
require ensure
state_closed: INTEGER_32
is 0
constant attribute
{}
state_in_header: INTEGER_32
is 10
constant attribute
{}
state_in_script: INTEGER_32
is 11
constant attribute
{}
state_in_noscript: INTEGER_32
is 12
constant attribute
{}
state_in_style: INTEGER_32
is 13
constant attribute
{}
state_in_body: INTEGER_32
is 20
constant attribute
{}
state_in_list: INTEGER_32
is 21
constant attribute
{}
state_in_list_item: INTEGER_32
is 22
constant attribute
{}
state_in_table: INTEGER_32
is 23
constant attribute
{}
state_in_table_row: INTEGER_32
is 24
constant attribute
{}
state_in_table_cell: INTEGER_32
is 25
constant attribute
{}
state_in_text_area: INTEGER_32
is 26
constant attribute
{}
state_in_paragraph: INTEGER_32
is 27
constant attribute
{}
state_in_blockquote: INTEGER_32
is 28
constant attribute
{}
state_in_div: INTEGER_32
is 29
constant attribute
{}
state_in_pre: INTEGER_32
is 30
constant attribute
{}
state_in_form: INTEGER_32
is 40
constant attribute
{}
state_in_select: INTEGER_32
is 41
constant attribute
{}
state_in_option: INTEGER_32
is 42
constant attribute
{}
state_in_frames: INTEGER_32
is 50
constant attribute
{}
state_in_frameset: INTEGER_32
is 51
constant attribute
{}
state_in_noframes: INTEGER_32
is 52
constant attribute
{}
state_in_span: INTEGER_32
is 53
constant attribute
{}
state_in_definition_list: INTEGER_32
is 60
constant attribute
{}
state_in_definition_description: INTEGER_32
is 61
constant attribute
{}
state_in_definition_term: INTEGER_32
is 62
constant attribute
{}
state_over: INTEGER_32
is 99
constant attribute
{}
pipe_character (c: CHARACTER)
effective procedure
{}
Put the character down the pipe.
pipe_string (s: STRING)
effective procedure
{}
Put the whole string down the pipe.
pipe_quoted_string (quoted: STRING)
effective procedure
{}
quote_quotes (quoted: STRING, in: STRING)
effective procedure
{}
Internal transformation in tag attributes
make
effective procedure
{ANY}
connect_to (a_stream: OUTPUT_STREAM)
effective procedure
{ANY}
Connect the filter to some underlying stream.
require
  • not is_connected
  • a_stream.is_connected
  • not a_stream.is_filtered
ensure
  • is_connected
local_can_disconnect: BOOLEAN
effective function
{}
True if this stream can be safely disconnected (without data loss, etc.)
without taking into account the state of the underlying stream.
writable attribute
{}
writable attribute
{}
has_cgi_header: BOOLEAN
writable attribute
{}
are there any CGI headers before the HTML itself is inserted?
last_character_is_new_line: BOOLEAN
writable attribute
{}
True if the last put character was a '%N'
%
os_key_colon: STRING
is ": "
constant attribute
{}
os_html_header: STRING
is "<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "dtd/xhtml1-transitional.dtd"> <html> <head> "
constant attribute
{}
os_html_body_start: STRING
is "</head> <body"
constant attribute
{}
os_html_body_footer: STRING
is "</body> </html> "
constant attribute
{}
os_html_frames_footer: STRING
is "</html> "
constant attribute
{}
os_start_comment: STRING
is "<!-- "
constant attribute
{}
os_end_comment: STRING
is " -->"
constant attribute
{}
os_entity_quot: STRING
is "&quot;"
constant attribute
{}
os_entity_lt: STRING
is "&lt;"
constant attribute
{}
os_entity_gt: STRING
is "&gt;"
constant attribute
{}
os_entity_amp: STRING
is "&amp;"
constant attribute
{}
os_base: STRING
is "<base href='"
constant attribute
{}
os_end_open_close_tag_attrib: STRING
is "'/>"
constant attribute
{}
os_meta_equiv: STRING
is "<meta http-equiv='"
constant attribute
{}
os_attrib_content: STRING
is "' content='"
constant attribute
{}
os_attrib_type: STRING
is "' type='"
constant attribute
{}
os_stylesheet: STRING
is "<link rel='StyleSheet' type='text/css' href='"
constant attribute
{}
os_text_javascript: STRING
is "text/javascript"
constant attribute
{}
os_title: STRING
is "title"
constant attribute
{}
os_script_begin: STRING
is "<script language='"
constant attribute
{}
os_attrib_src: STRING
is "' src='"
constant attribute
{}
os_script_end: STRING
is "'></script>"
constant attribute
{}
os_language: STRING
is "language"
constant attribute
{}
os_javascript: STRING
is "javascript"
constant attribute
{}
os_script: STRING
is "script"
constant attribute
{}
os_noscript: STRING
is "noscript"
constant attribute
{}
os_style: STRING
is "style"
constant attribute
{}
os_h1: STRING
is "h1"
constant attribute
{}
os_h2: STRING
is "h2"
constant attribute
{}
os_h3: STRING
is "h3"
constant attribute
{}
os_br: STRING
is "br"
constant attribute
{}
os_hr: STRING
is "hr"
constant attribute
{}
os_img: STRING
is "img"
constant attribute
{}
os_src: STRING
is "src"
constant attribute
{}
os_b: STRING
is "b"
constant attribute
{}
os_i: STRING
is "i"
constant attribute
{}
os_u: STRING
is "u"
constant attribute
{}
os_tt: STRING
is "tt"
constant attribute
{}
os_size: STRING
is "size"
constant attribute
{}
os_font: STRING
is "font"
constant attribute
{}
os_pre: STRING
is "pre"
constant attribute
{}
os_href: STRING
is "href"
constant attribute
{}
os_target: STRING
is "target"
constant attribute
{}
os_name: STRING
is "name"
constant attribute
{}
os_a: STRING
is "a"
constant attribute
{}
os_ul: STRING
is "ul"
constant attribute
{}
os_dt: STRING
is "dt"
constant attribute
{}
os_dd: STRING
is "dd"
constant attribute
{}
os_dl: STRING
is "dl"
constant attribute
{}
os_ol: STRING
is "ol"
constant attribute
{}
os_li: STRING
is "li"
constant attribute
{}
os_table: STRING
is "table"
constant attribute
{}
os_tr: STRING
is "tr"
constant attribute
{}
os_td: STRING
is "td"
constant attribute
{}
os_method_get: STRING
is "GET"
constant attribute
{}
os_method_post: STRING
is "POST"
constant attribute
{}
os_method: STRING
is "method"
constant attribute
{}
os_action: STRING
is "action"
constant attribute
{}
os_form: STRING
is "form"
constant attribute
{}
os_rows: STRING
is "rows"
constant attribute
{}
os_cols: STRING
is "cols"
constant attribute
{}
os_textarea: STRING
is "textarea"
constant attribute
{}
os_submit: STRING
is "submit"
constant attribute
{}
os_button: STRING
is "button"
constant attribute
{}
os_reset: STRING
is "reset"
constant attribute
{}
os_hidden: STRING
is "hidden"
constant attribute
{}
os_password: STRING
is "password"
constant attribute
{}
os_text: STRING
is "text"
constant attribute
{}
os_radio: STRING
is "radio"
constant attribute
{}
os_checkbox: STRING
is "checkbox"
constant attribute
{}
os_select: STRING
is "select"
constant attribute
{}
os_multiple: STRING
is "multiple"
constant attribute
{}
os_value: STRING
is "value"
constant attribute
{}
os_option: STRING
is "option"
constant attribute
{}
os_type: STRING
is "type"
constant attribute
{}
os_checked: STRING
is "checked"
constant attribute
{}
os_input: STRING
is "input"
constant attribute
{}
os_frameset: STRING
is "frameset"
constant attribute
{}
os_frame: STRING
is "frame"
constant attribute
{}
os_noframes: STRING
is "noframes"
constant attribute
{}
os_paragraph: STRING
is "p"
constant attribute
{}
os_blockquote: STRING
is "blockquote"
constant attribute
{}
os_div: STRING
is "div"
constant attribute
{}
os_span: STRING
is "span"
constant attribute
{}
os: STRING
is ""
constant attribute
{}
used as a buffer
disconnect
effective procedure
{ANY}
Disconnect from the underlying stream.
require
    • is_connected
    • can_disconnect
      • is_connected
      • can_disconnect
      • is_connected
      • can_disconnect
ensure
  • not is_connected
  • stream = Void
  • not is_filtered
do_detach
effective procedure
Used by the underlying stream to require not to be filtered anymore
ensure
  • stream = Void
stream: OUTPUT_STREAM
writable attribute
{}
The underlying stream (i.e. the filtered one)
put_character (c: CHARACTER)
effective procedure
{ANY}
require
  • is_connected
  • not is_filtered and then can_put_character(c)
flush
effective procedure
{ANY}
Flushes the pipe.
If is_filtered, calls the filter's flush instead.
require
  • is_connected
detach
effective procedure
{ANY}
Shake off the filter.
ensure
  • not is_filtered
writable attribute
The filter that uses this stream as backend
event_can_write: EVENT_DESCRIPTOR
effective function
{ANY}
writable attribute
{}
new_url: URL
effective function
{}
ensure
  • Result /= Void
as_output_stream: OUTPUT_STREAM
effective function
{}
ensure
  • yes_indeed_it_is_the_same_object: Result.to_pointer = to_pointer
is_connected: BOOLEAN
deferred function
{ANY}
True if the stream is connected.
Only in that case can data be transferred via this stream.
descriptor: INTEGER_32
effective function
{ANY}
Some OS-dependent descriptor.
Mainly used by the sequencer library (see READY_CONDITION).
require
has_descriptor: BOOLEAN
effective function
{ANY}
True if that stream can be associated to some OS-meaningful descriptor.
require
can_disconnect: BOOLEAN
deferred function
{ANY}
True if the stream can be safely disconnected (without data loss, etc.)
require
url: URL
frozen
effective function
{ANY}
The URL to this stream as resource
ensure
  • not_void: Result /= Void
  • always_the_same: Result = url
url_memory: URL
writable attribute
{}
stream_pointer: POINTER
effective function
Some Back-end-dependent pointer (FILE* in C, InputStream or OutputStream in Java)
has_stream_pointer: BOOLEAN
effective function
True if that stream can be associated to some Back-end-meaningful stream pointer.
require
filtered_descriptor: INTEGER_32
deferred function
Find the descriptor of the terminal stream...
Filters do not have descriptors of their own
require
filtered_has_descriptor: BOOLEAN
deferred function
True if the underlying terminal stream has a descriptor
require
filtered_stream_pointer: POINTER
deferred function
Find the pointer of the terminal stream...
Filters do not have pointers of their own
require
filtered_has_stream_pointer: BOOLEAN
deferred function
True if the underlying terminal stream has a pointer
require
event_exception: EVENT_DESCRIPTOR
effective function
{ANY}
stream_exception: STREAM_EXCEPTION
writable attribute
{}
recycle
effective procedure
Do whatever needs to be done to free resources or recycle other objects when recycling this one
dispose
effective procedure
{}
Action to be executed just before garbage collection reclaims an object.
sequencer_descriptor (file: POINTER): INTEGER_32
{}
is_filtered: BOOLEAN
deferred function
{ANY}
put_natively_stored_string (s: NATIVELY_STORED_STRING)
effective procedure
require
  • s /= Void
put_abstract_string (s: ABSTRACT_STRING)
effective procedure
require
  • s /= Void
put_string (s: ABSTRACT_STRING)
effective procedure
{ANY}
Output s to current output device.
require
put_unicode_string (unicode_string: UNICODE_STRING)
effective procedure
{ANY}
Output the UTF-8 encoding of the unicode_string.
require
put_line (s: ABSTRACT_STRING)
effective procedure
{ANY}
Output the string followed by a '%N'.
%
put_integer (i: INTEGER_64)
frozen
effective procedure
{ANY}
Output i to current output device.
put_integer_format (i: INTEGER_64, s: INTEGER_32)
frozen
effective procedure
{ANY}
Output i to current output device using at most s character.
put_natural_8 (n: NATURAL_8)
frozen
effective procedure
{ANY}
Output n to current output device.
put_natural_8_format (n: NATURAL_8, s: INTEGER_32)
frozen
effective procedure
{ANY}
Output n to current output device using at most s character.
put_natural_16 (n: NATURAL_16)
frozen
effective procedure
{ANY}
Output n to current output device.
put_natural_16_format (n: NATURAL_16, s: INTEGER_32)
frozen
effective procedure
{ANY}
Output n to current output device using at most s character.
put_natural_32 (n: NATURAL_32)
frozen
effective procedure
{ANY}
Output n to current output device.
put_natural_32_format (n: NATURAL_32, s: INTEGER_32)
frozen
effective procedure
{ANY}
Output n to current output device using at most s character.
put_natural_64 (n: NATURAL_64)
frozen
effective procedure
{ANY}
Output n to current output device.
put_natural_64_format (n: NATURAL_64, s: INTEGER_32)
frozen
effective procedure
{ANY}
Output n to current output device using at most s character.
put_real (r: REAL_64)
effective procedure
{ANY}
Output r to current output device.
put_real_format (r: REAL_64, f: INTEGER_32)
effective procedure
{ANY}
Output r with only f digit for the fractional part.
Examples:
   put_real(3.519,2) print "3.51".
require
put_real_scientific (r: REAL_64, f: INTEGER_32)
effective procedure
{ANY}
Output r using the scientific notation with only f digit for the fractional part.
Examples:
   put_real_scientific(3.519,2) print "3.16e+00".
require
put_number (number: NUMBER)
effective procedure
{ANY}
Output the number.
require
put_boolean (b: BOOLEAN)
effective procedure
{ANY}
Output b to current output device according to the Eiffel format.
put_pointer (p: POINTER)
effective procedure
{ANY}
Output a viewable version of p.
put_new_line
effective procedure
{ANY}
Output a newline character.
put_spaces (nb: INTEGER_32)
effective procedure
{ANY}
Output nb spaces character.
require
append_file (file_name: STRING)
effective procedure
{ANY}
require
tmp_file_read: TEXT_FILE_READ
once function
{}
tmp_string: STRING
once function
{}
io_putc (byte: CHARACTER, stream: POINTER)
{}
io_fwrite (buf: NATIVE_ARRAY[CHARACTER], size: INTEGER_32, stream: POINTER): INTEGER_32
{}
io_flush (stream: POINTER)
{}
set_filter (a_filter: FILTER)
effective procedure
Used by the filter itself to get attached
require
  • a_filter /= Void
ensure