Commit Graph

57 Commits

Author SHA1 Message Date
Sergey Biryukov c03305852e Code Modernization: Add `AllowDynamicProperties` attribute to all (parent) classes.
Dynamic (non-explicitly declared) properties are deprecated as of PHP 8.2 and are expected to become a fatal error in PHP 9.0.

There are a number of ways to mitigate this:
* If it is an accidental typo for a declared property: fix the typo.
* For known properties: declare them on the class.
* For unknown properties: add the magic `__get()`, `__set()`, et al. methods to the class or let the class extend `stdClass` which has highly optimized versions of these magic methods built in.
* For unknown ''use'' of dynamic properties, the `#[AllowDynamicProperties]` attribute can be added to the class. The attribute will automatically be inherited by child classes.

Trac ticket #56034 is open to investigate and handle the third and fourth type of situations, however it has become clear this will need more time and will not be ready in time for WP 6.1.

To reduce “noise” in the meantime, both in the error logs of WP users moving onto PHP 8.2, in the test run logs of WP itself, in test runs of plugins and themes, as well as to prevent duplicate tickets from being opened for the same issue, this commit adds the `#[AllowDynamicProperties]` attribute to all “parent” classes in WP.

The logic used for this commit is as follows:
* If a class already has the attribute: no action needed.
* If a class does not `extend`: add the attribute.
* If a class does `extend`:
 - If it extends `stdClass`: no action needed (as `stdClass` supports dynamic properties).
 - If it extends a PHP native class: add the attribute.
 - If it extends a class from one of WP's external dependencies: add the attribute.
* In all other cases: no action — the attribute should not be needed as child classes inherit from the parent.

Whether or not a class contains magic methods has not been taken into account, as a review of the currently existing magic methods has shown that those are generally not sturdy enough and often even set dynamic properties (which they should not). See the [https://www.youtube.com/watch?v=vDZWepDQQVE live stream from August 16, 2022] for more details.

This commit only affects classes in the `src` directory of WordPress core.
* Tests should not get this attribute, but should be fixed to not use dynamic properties instead. Patches for this are already being committed under ticket #56033.
* While a number bundled themes (2014, 2019, 2020, 2021) contain classes, they are not a part of this commit and may be updated separately.

Reference: [https://wiki.php.net/rfc/deprecate_dynamic_properties PHP RFC: Deprecate dynamic properties].

Follow-up to [53922].

Props jrf, hellofromTonya, markjaquith, peterwilsoncc, costdev, knutsp, aristath.
See #56513, #56034.
Built from https://develop.svn.wordpress.org/trunk@54133


git-svn-id: http://core.svn.wordpress.org/trunk@53692 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2022-09-12 15:47:14 +00:00
Sergey Biryukov a7b2ae76c1 Code Modernization: Rename parameters that use reserved keywords in `wp-includes/class-wp-query.php`.
While using reserved PHP keywords as parameter name labels is allowed, in the context of function calls using named parameters in PHP 8.0+, this will easily lead to confusion. To avoid that, it is recommended not to use reserved keywords as function parameter names.

This commit renames the `$list` parameter to `$status` in `WP_Dependencies::query()`.

Follow-up to [52946], [52996], [52997], [52998], [53003], [53014], [53029], [53039], [53116], [53117], [53137], [53174], [53184], [53185], [53192], [53193], [53198], [53203], [53207], [53215], [53216], [53220], [53230], [53232], [53236], [53239], [53240], [53242], [53243], [53245], [53246], [53257], [53269], [53270], [53271], [53272], [53273], [53274], [53275], [53276], [53277].

Props jrf, aristath, poena, justinahinon, SergeyBiryukov.
See #55327.
Built from https://develop.svn.wordpress.org/trunk@53281


git-svn-id: http://core.svn.wordpress.org/trunk@52870 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2022-04-26 14:28:08 +00:00
audrasjb 153e27f625 Coding Standards: Replace `else if` with `elseif` after [52338].
Follow-up to [52338].

Built from https://develop.svn.wordpress.org/trunk@52339


git-svn-id: http://core.svn.wordpress.org/trunk@51931 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2021-12-07 17:49:01 +00:00
audrasjb cdafa716f7 Script Loader: Allow for `wp_register_script()` to be called after `wp_enqueue_script()`.
When a plugin registers styles/scripts on `wp_enqueue_scripts` (as plugin authors are encouraged to do), and conditionally enqueues their script/style on `the_content` filter, things "just work". In block themes, `the_content` is run prior to the header being processed, which results in the above scenario failing.

This change makes a `wp_enqueue_script( 'example' ); wp_register_script( 'example' );` work, where as currently the enqueue silently fails (no "doing it wrong" message) and the following register has no impact. Scripts can therefore be enqueued and dequeued (by "handle") before they are registered.

Fixes #54529.

Built from https://develop.svn.wordpress.org/trunk@52338


git-svn-id: http://core.svn.wordpress.org/trunk@51930 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2021-12-07 17:46:01 +00:00
John Blackbourn 6e1cc35a98 Docs: Miscellaneous docblock corrections and improvements.
See #52217, #53399

Built from https://develop.svn.wordpress.org/trunk@51851


git-svn-id: http://core.svn.wordpress.org/trunk@51450 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2021-09-22 21:23:00 +00:00
Sergey Biryukov bf3296a9a0 Script Loader: Add the `$group` parameter to `WP_Dependencies::do_item()`.
Previously, the method was called with two parameters in `::do_items()`, while the method signature only included one parameter.

Technically, this was not an issue as `WP_Dependencies::do_item()` is a placeholder meant to be overwritten when extending the class. When handling scripts, `WP_Dependencies` is extended with `WP_Scripts`, and the `$group` parameter was only used in `WP_Scripts::do_item()`, which does expect a second argument.

However, officially adding the parameter to `WP_Dependencies::do_item()` signature prevents code misunderstanding and avoids a warning in PHP code inspection tools.

Props kaggdesign, soulseekah, azaozz, SergeyBiryukov.
Fixes #43627.
Built from https://develop.svn.wordpress.org/trunk@47769


git-svn-id: http://core.svn.wordpress.org/trunk@47545 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2020-05-06 16:27:12 +00:00
Sergey Biryukov 55482506a3 Docs: Revert a type change for the `$value` parameter of `WP_Dependencies::add_data()` in [47170].
Although described as a string in several places, it's technically not limited to a particular type.

Props westonruter.
See #48303.
Built from https://develop.svn.wordpress.org/trunk@47502


git-svn-id: http://core.svn.wordpress.org/trunk@47277 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2020-03-24 20:56:09 +00:00
Sergey Biryukov 67a6527d51 Script Loader: Improve performance of `wp_script_is()` for scripts registered with complex dependencies.
This switches `WP_Dependencies::recurse_deps()` from recursively checking the same handles over and over again to keep a flattened array of queued items and their dependencies for faster lookup in `WP_Dependencies::query()`.

Props superdav42.
Fixes #46469.
Built from https://develop.svn.wordpress.org/trunk@47359


git-svn-id: http://core.svn.wordpress.org/trunk@47146 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2020-02-25 13:42:05 +00:00
Sergey Biryukov c289bb59ac Docs: Improve documentation for `WP_Dependencies`, `WP_Scripts`, and `WP_Styles` methods.
See #48303.
Built from https://develop.svn.wordpress.org/trunk@47170


git-svn-id: http://core.svn.wordpress.org/trunk@46970 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2020-02-03 00:19:03 +00:00
Sergey Biryukov 001ffe81fb Docs: Improve inline comments per the documentation standards.
Includes minor code layout fixes for better readability.

See #48303.
Built from https://develop.svn.wordpress.org/trunk@47122


git-svn-id: http://core.svn.wordpress.org/trunk@46922 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2020-01-29 00:45:18 +00:00
John Blackbourn 9ac1d82f23 Docs: Further improve documentation of known return types, plus other docs fixes.
See #48303

Built from https://develop.svn.wordpress.org/trunk@46661


git-svn-id: http://core.svn.wordpress.org/trunk@46461 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-11-05 21:27:02 +00:00
Gary Pendergast 4803fc405e Coding Standards: Fix the `Squiz.PHP.DisallowMultipleAssignments` violations in `wp-includes`.
See #47632.


Built from https://develop.svn.wordpress.org/trunk@45590


git-svn-id: http://core.svn.wordpress.org/trunk@45401 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-07-02 23:42:58 +00:00
Sergey Biryukov 0d05b99e1b Docs: Document that the `$src` parameter of `WP_Dependencies::add()` can be boolean.
Props dimadin.
Fixes #45009.
Built from https://develop.svn.wordpress.org/trunk@43661


git-svn-id: http://core.svn.wordpress.org/trunk@43490 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-09-28 21:51:24 +00:00
John Blackbourn 2361ca884f Docs: Document more parameters and properties using typed array notation.
See #41756

Built from https://develop.svn.wordpress.org/trunk@42876


git-svn-id: http://core.svn.wordpress.org/trunk@42706 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-03-25 19:33:31 +00:00
Gary Pendergast aaf99e6913 Code is Poetry.
WordPress' code just... wasn't.
This is now dealt with.

Props jrf, pento, netweb, GaryJ, jdgrimes, westonruter, Greg Sherwood from PHPCS, and everyone who's ever contributed to WPCS and PHPCS.
Fixes #41057.


Built from https://develop.svn.wordpress.org/trunk@42343


git-svn-id: http://core.svn.wordpress.org/trunk@42172 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-11-30 23:11:00 +00:00
Drew Jaynes 0860bb2771 Docs: Remove `@access` notations from method DocBlocks in wp-includes/* classes.
Prior to about 2013, many class methods lacked even access modifiers which made the `@access` notations that much more useful. Now that we've gotten to a point where the codebase is more mature from a maintenance perspective and we can finally remove these notations. Notable exceptions to this change include standalone functions notated as private as well as some classes still considered to represent "private" APIs.

See #41452.

Built from https://develop.svn.wordpress.org/trunk@41162


git-svn-id: http://core.svn.wordpress.org/trunk@41002 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-27 00:41:44 +00:00
Drew Jaynes 1d95dcfa2c Docs: Remove superfluous `@package WordPress` and `@subpackage` notations used outside of file headers in a variety of core files.
Per the inline documentation standards for PHP, there should only be one `@package` and/or `@subpackage` notation per file, and only in the file header.

See #41017.

Built from https://develop.svn.wordpress.org/trunk@40988


git-svn-id: http://core.svn.wordpress.org/trunk@40838 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-01 16:58:42 +00:00
Scott Taylor b2c394a330 Script Loader: move `_WP_Dependency` into its own file.
See #37827.

Built from https://develop.svn.wordpress.org/trunk@38375


git-svn-id: http://core.svn.wordpress.org/trunk@38316 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-08-26 18:06:39 +00:00
John Blackbourn 2cee8966ab Docs: Re-add a `@param` that went missing in [36993].
See #32246

Built from https://develop.svn.wordpress.org/trunk@36994


git-svn-id: http://core.svn.wordpress.org/trunk@36961 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-03-14 22:39:26 +00:00
John Blackbourn 7ecfdc69b7 Docs: Improvements and corrections for the `$ver` parameter of the dependencies API functions.
See #32246

Built from https://develop.svn.wordpress.org/trunk@36993


git-svn-id: http://core.svn.wordpress.org/trunk@36960 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-03-14 22:37:26 +00:00
Dominik Schilling f4ef187c2c Dependencies: Improve group processing of script dependencies.
This is a follow-up to [36604].

When processing dependencies `$this->group` will be the minimum of the script's registered group and all preceding siblings. This is wrong because only a scripts ancestors in the dependency chain should affect where it is loaded. Effectively `$this->group` introduced a form of global state which potentially corrupted the group of dependencies. Sorting covers up this problem.
The issue in #35873 was that script were not moving their dependencies to a lower group when necessary.

The fix:
* In `WP_Dependencies::all_deps()` pass the new `$group` value to `WP_Dependencies::all_deps()`. Previously the wrong value was passed because the parent script could have moved with `WP_Scripts::set_group()`.
* In `WP_Scripts::all_deps()` pass the `$group` parameter to `WP_Dependencies::all_deps()` so it doesn't always use `false` for `$group`. Same for `WP_Styles::all_deps()`.

Props stephenharris, gitlost.
Fixes #35956.
Built from https://develop.svn.wordpress.org/trunk@36871


git-svn-id: http://core.svn.wordpress.org/trunk@36838 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-03-06 19:50:27 +00:00
Dominik Schilling 820c9e2fca Docs: Improve inline docs for `WP_Dependencies`, `WP_Styles`, and `WP_Scripts`.
Also, make them and related files part of WordPress.

See #35964.
Built from https://develop.svn.wordpress.org/trunk@36744


git-svn-id: http://core.svn.wordpress.org/trunk@36711 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-02-27 20:34:29 +00:00
Dominik Schilling a09799fa40 Docs: In `WP_Dependencies` add a changelog entry for the `$group` parameter.
See #35964.
Built from https://develop.svn.wordpress.org/trunk@36732


git-svn-id: http://core.svn.wordpress.org/trunk@36699 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-02-26 13:50:25 +00:00
Dominik Schilling c8923e5710 Docs: In `WP_Dependencies` add a changelog entry to methods which were moved from `WP_Scripts` to `WP_Dependencies`.
See #35964.
Built from https://develop.svn.wordpress.org/trunk@36731


git-svn-id: http://core.svn.wordpress.org/trunk@36698 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-02-26 13:23:25 +00:00
John Blackbourn cfc503e921 Docs: Correct the possible return types for `WP_Dependencies::query()`.
See #32246

Built from https://develop.svn.wordpress.org/trunk@36713


git-svn-id: http://core.svn.wordpress.org/trunk@36680 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-02-25 21:26:26 +00:00
Dominik Schilling 826e2d8ea1 Script Loader: Fix missing script output when the groups of dependencies are different.
Aka: Don't lose the grandchild.

Props gitlost, ocean90.
Fixes #35873.
Built from https://develop.svn.wordpress.org/trunk@36604


git-svn-id: http://core.svn.wordpress.org/trunk@36571 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-02-20 22:11:25 +00:00
Dominik Schilling bc5d22266d Script/Style Dependencies: Make sure that inline styles for handles without a source are printed.
This prevents breaking plugins which are adding inline styles to the `wp-admin` handle after [36341].

Props dd32, ocean90.
Fixes #35229.
Built from https://develop.svn.wordpress.org/trunk@36550


git-svn-id: http://core.svn.wordpress.org/trunk@36517 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-02-17 17:11:26 +00:00
Scott Taylor ef87172270 `foreach` is a statement, not a function.
See #33491.

Built from https://develop.svn.wordpress.org/trunk@33734


git-svn-id: http://core.svn.wordpress.org/trunk@33702 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-08-25 20:28:22 +00:00
Scott Taylor a0e373ef80 For doc block types, favor `bool` over the few remaining `boolean`s
See #32444.

Built from https://develop.svn.wordpress.org/trunk@32964


git-svn-id: http://core.svn.wordpress.org/trunk@32935 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-06-27 01:03:25 +00:00
John Blackbourn 987716720f Add a return value to `wp_register_script()` and `wp_register_style()` which matches the return value of `WP_Dependencies::add()`.
Props katzwebdesign, pareshradadiya, DrewAPicture.

Fixes #31126

Built from https://develop.svn.wordpress.org/trunk@32483


git-svn-id: http://core.svn.wordpress.org/trunk@32453 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-05-10 19:57:25 +00:00
Drew Jaynes 273396fe1e Ensure inline code is markdown-escaped as such, and that code snippets in descriptions are properly indented.
Affects DocBlocks for the following core elements:
* Backtick-escapes a `<link>` tag in a parameter description for the `embed_oembed_discover` hook
* Inline code fixes in the summary and return description for `WP_List_Table::get_table_classes()`
* Removes HTML markup from the summary for `WP_List_Table::display_rows_or_placeholder()`
* Backtick-escapes a `<tr>` tag in a parameter description for `WP_Users_List_Table::single_row()`
* Converts non-DocBlocks into multi-line comments in `WP_Dependencies::do_items()`
* Removes HTML markup from the summary for the `comment_form_top` hook.
* Inline code and snippet fixes in the description for `wp_get_schedules()`

Props rarst for the initial patch.
See #30473.

Built from https://develop.svn.wordpress.org/trunk@30537


git-svn-id: http://core.svn.wordpress.org/trunk@30526 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-11-24 04:58:22 +00:00
Scott Taylor 0d387bf76e `WP_Dependencies->recurse_deps()`: tuck the recursion into `elseif` so the `foreach` doesn't break on the first item.
See [29252].

Built from https://develop.svn.wordpress.org/trunk@29253


git-svn-id: http://core.svn.wordpress.org/trunk@29036 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-07-20 00:34:15 +00:00
Scott Taylor f93abf2bea `wp_script_is( ..., 'enqueued' )` needs to check dependencies recursively - a single item's dependencies may only be a subset of the full dependency tree. Adds a new method on `WP_Dependencies` called `->recurse_deps()`.
Adds unit test.

Props wonderboymusic, SergeyBiryukov, mikejolley.
Fixes #28404.

Built from https://develop.svn.wordpress.org/trunk@29252


git-svn-id: http://core.svn.wordpress.org/trunk@29035 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-07-20 00:29:16 +00:00
Scott Taylor f998ac39d3 Add missing access modifiers to methods in `WP_Dependencies` and `_WP_Dependency`.
See #27881, #22234.

Built from https://develop.svn.wordpress.org/trunk@28517


git-svn-id: http://core.svn.wordpress.org/trunk@28343 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-19 06:14:14 +00:00
Drew Jaynes 16f0d8b1ea Inline documentation for WP_Dependencies and _WP_Dependency classes.
Props kitchin for the initial patch.
Fixes #23914.

Built from https://develop.svn.wordpress.org/trunk@25524


git-svn-id: http://core.svn.wordpress.org/trunk@25444 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2013-09-20 19:54:10 +00:00
Drew Jaynes 9151227edf Inline documentation for _WP_Dependency class properties.
See #23914.

Built from https://develop.svn.wordpress.org/trunk@25518


git-svn-id: http://core.svn.wordpress.org/trunk@25438 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2013-09-20 17:46:09 +00:00
Drew Jaynes cee2a3e227 Inline documentation for WP_Dependencies class properties.
See #23914.

Built from https://develop.svn.wordpress.org/trunk@25517


git-svn-id: http://core.svn.wordpress.org/trunk@25437 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2013-09-20 17:44:17 +00:00
Ryan Boren 02d584b4c7 Revert [21420] and [21481]. Accepting a string caused back compat problems including the possibility of revealing previously hidden circular dependencies resulting in infinite loops.
fixes #20683 #22111
see #21520


git-svn-id: http://core.svn.wordpress.org/trunk@22286 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-10-23 20:32:12 +00:00
Andrew Nacin e03bb0d1ac Have wp_script_is() and wp_style_is() accept 'enqueued', as it reads better than 'queue' and is consistent with 'registered'. fixes #21741.
git-svn-id: http://core.svn.wordpress.org/trunk@21672 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-08-30 18:57:57 +00:00
azaozz cbc9aabfa4 When WP_Dependencies accept a string for a single dependency, make sure the string is not empty, see #20683
git-svn-id: http://core.svn.wordpress.org/trunk@21481 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-08-08 17:21:24 +00:00
markjaquith eedce37675 Let WP_Dependencies accept a string for a single dependency instead of requiring an array wrapper. props vhauri. fixes #20683
git-svn-id: http://core.svn.wordpress.org/trunk@21420 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-08-04 17:59:55 +00:00
ryan 07ff8b216b Use one space, not two, after trailing punctuation. fixes #19537
git-svn-id: http://svn.automattic.com/wordpress/trunk@19593 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-12-13 23:45:31 +00:00
azaozz 23b9d7759a Introduce WP_Dependencies::get_data() method, change scripts and styles priority to follow the "natural" order in HTML, i.e. the last one wins, props scribu, see #11520
git-svn-id: http://svn.automattic.com/wordpress/trunk@18480 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-07-28 18:24:00 +00:00
azaozz 23f490bb02 Support for using wp_enqueue_script() and wp_enqueue_style() in the HTML body. All scripts and styles are added in the footer, fixes #9346
git-svn-id: http://svn.automattic.com/wordpress/trunk@18446 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-07-21 16:32:01 +00:00
ryan 04487fc268 Constructor cleanup. Props ocean90. fixes #16768
git-svn-id: http://svn.automattic.com/wordpress/trunk@17771 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-04-29 20:05:12 +00:00
ryan b60c345536 Remove PHP4 constructors. Props hakre. see #16768
git-svn-id: http://svn.automattic.com/wordpress/trunk@17604 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-04-05 17:25:08 +00:00
nacin b8ce0261df More param fixes, props duck_. see #14783.
git-svn-id: http://svn.automattic.com/wordpress/trunk@16469 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2010-11-18 19:12:48 +00:00
ryan 2d360ad164 Revert [15637]. Still needed for PHP4.
git-svn-id: http://svn.automattic.com/wordpress/trunk@15639 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2010-09-20 19:17:47 +00:00
ryan bef67a04e2 Remove annoying, useless construcotrs. Props Rasmus. http://talks.php.net/show/confoo10/8
git-svn-id: http://svn.automattic.com/wordpress/trunk@15637 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2010-09-20 18:53:03 +00:00
azaozz 7b40c7a03f WP_Dependencies: pass NULL to disable script and style version query strings, props scribu amattie, fixes #11315
git-svn-id: http://svn.automattic.com/wordpress/trunk@12558 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2009-12-28 00:48:20 +00:00