Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
Complex classes like Message often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use Message, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
159 | class Message implements MessageSpecifier, Serializable { |
||
160 | /** Use message text as-is */ |
||
161 | const FORMAT_PLAIN = 'plain'; |
||
162 | /** Use normal wikitext -> HTML parsing (the result will be wrapped in a block-level HTML tag) */ |
||
163 | const FORMAT_BLOCK_PARSE = 'block-parse'; |
||
164 | /** Use normal wikitext -> HTML parsing but strip the block-level wrapper */ |
||
165 | const FORMAT_PARSE = 'parse'; |
||
166 | /** Transform {{..}} constructs but don't transform to HTML */ |
||
167 | const FORMAT_TEXT = 'text'; |
||
168 | /** Transform {{..}} constructs, HTML-escape the result */ |
||
169 | const FORMAT_ESCAPED = 'escaped'; |
||
170 | |||
171 | /** |
||
172 | * In which language to get this message. True, which is the default, |
||
173 | * means the current user language, false content language. |
||
174 | * |
||
175 | * @var bool |
||
176 | */ |
||
177 | protected $interface = true; |
||
178 | |||
179 | /** |
||
180 | * In which language to get this message. Overrides the $interface setting. |
||
181 | * |
||
182 | * @var Language|bool Explicit language object, or false for user language |
||
183 | */ |
||
184 | protected $language = false; |
||
185 | |||
186 | /** |
||
187 | * @var string The message key. If $keysToTry has more than one element, |
||
188 | * this may change to one of the keys to try when fetching the message text. |
||
189 | */ |
||
190 | protected $key; |
||
191 | |||
192 | /** |
||
193 | * @var string[] List of keys to try when fetching the message. |
||
194 | */ |
||
195 | protected $keysToTry; |
||
196 | |||
197 | /** |
||
198 | * @var array List of parameters which will be substituted into the message. |
||
199 | */ |
||
200 | protected $parameters = []; |
||
201 | |||
202 | /** |
||
203 | * @var string |
||
204 | * @deprecated |
||
205 | */ |
||
206 | protected $format = 'parse'; |
||
207 | |||
208 | /** |
||
209 | * @var bool Whether database can be used. |
||
210 | */ |
||
211 | protected $useDatabase = true; |
||
212 | |||
213 | /** |
||
214 | * @var Title Title object to use as context. |
||
215 | */ |
||
216 | protected $title = null; |
||
217 | |||
218 | /** |
||
219 | * @var Content Content object representing the message. |
||
220 | */ |
||
221 | protected $content = null; |
||
222 | |||
223 | /** |
||
224 | * @var string |
||
225 | */ |
||
226 | protected $message; |
||
227 | |||
228 | /** |
||
229 | * @since 1.17 |
||
230 | * @param string|string[]|MessageSpecifier $key Message key, or array of |
||
231 | * message keys to try and use the first non-empty message for, or a |
||
232 | * MessageSpecifier to copy from. |
||
233 | * @param array $params Message parameters. |
||
234 | * @param Language $language [optional] Language to use (defaults to current user language). |
||
235 | * @throws InvalidArgumentException |
||
236 | */ |
||
237 | public function __construct( $key, $params = [], Language $language = null ) { |
||
238 | if ( $key instanceof MessageSpecifier ) { |
||
239 | if ( $params ) { |
||
240 | throw new InvalidArgumentException( |
||
241 | '$params must be empty if $key is a MessageSpecifier' |
||
242 | ); |
||
243 | } |
||
244 | $params = $key->getParams(); |
||
245 | $key = $key->getKey(); |
||
246 | } |
||
247 | |||
248 | if ( !is_string( $key ) && !is_array( $key ) ) { |
||
249 | throw new InvalidArgumentException( '$key must be a string or an array' ); |
||
250 | } |
||
251 | |||
252 | $this->keysToTry = (array)$key; |
||
253 | |||
254 | if ( empty( $this->keysToTry ) ) { |
||
255 | throw new InvalidArgumentException( '$key must not be an empty list' ); |
||
256 | } |
||
257 | |||
258 | $this->key = reset( $this->keysToTry ); |
||
259 | |||
260 | $this->parameters = array_values( $params ); |
||
261 | // User language is only resolved in getLanguage(). This helps preserve the |
||
262 | // semantic intent of "user language" across serialize() and unserialize(). |
||
263 | $this->language = $language ?: false; |
||
264 | } |
||
265 | |||
266 | /** |
||
267 | * @see Serializable::serialize() |
||
268 | * @since 1.26 |
||
269 | * @return string |
||
270 | */ |
||
271 | public function serialize() { |
||
283 | |||
284 | /** |
||
285 | * @see Serializable::unserialize() |
||
286 | * @since 1.26 |
||
287 | * @param string $serialized |
||
288 | */ |
||
289 | public function unserialize( $serialized ) { |
||
300 | |||
301 | /** |
||
302 | * @since 1.24 |
||
303 | * |
||
304 | * @return bool True if this is a multi-key message, that is, if the key provided to the |
||
305 | * constructor was a fallback list of keys to try. |
||
306 | */ |
||
307 | public function isMultiKey() { |
||
310 | |||
311 | /** |
||
312 | * @since 1.24 |
||
313 | * |
||
314 | * @return string[] The list of keys to try when fetching the message text, |
||
315 | * in order of preference. |
||
316 | */ |
||
317 | public function getKeysToTry() { |
||
320 | |||
321 | /** |
||
322 | * Returns the message key. |
||
323 | * |
||
324 | * If a list of multiple possible keys was supplied to the constructor, this method may |
||
325 | * return any of these keys. After the message has been fetched, this method will return |
||
326 | * the key that was actually used to fetch the message. |
||
327 | * |
||
328 | * @since 1.21 |
||
329 | * |
||
330 | * @return string |
||
331 | */ |
||
332 | public function getKey() { |
||
335 | |||
336 | /** |
||
337 | * Returns the message parameters. |
||
338 | * |
||
339 | * @since 1.21 |
||
340 | * |
||
341 | * @return array |
||
342 | */ |
||
343 | public function getParams() { |
||
346 | |||
347 | /** |
||
348 | * Returns the message format. |
||
349 | * |
||
350 | * @since 1.21 |
||
351 | * |
||
352 | * @return string |
||
353 | * @deprecated since 1.29 formatting is not stateful |
||
354 | */ |
||
355 | public function getFormat() { |
||
359 | |||
360 | /** |
||
361 | * Returns the Language of the Message. |
||
362 | * |
||
363 | * @since 1.23 |
||
364 | * |
||
365 | * @return Language |
||
366 | */ |
||
367 | public function getLanguage() { |
||
371 | |||
372 | /** |
||
373 | * Factory function that is just wrapper for the real constructor. It is |
||
374 | * intended to be used instead of the real constructor, because it allows |
||
375 | * chaining method calls, while new objects don't. |
||
376 | * |
||
377 | * @since 1.17 |
||
378 | * |
||
379 | * @param string|string[]|MessageSpecifier $key |
||
380 | * @param mixed $param,... Parameters as strings. |
||
381 | * |
||
382 | * @return Message |
||
383 | */ |
||
384 | public static function newFromKey( $key /*...*/ ) { |
||
389 | |||
390 | /** |
||
391 | * Transform a MessageSpecifier or a primitive value used interchangeably with |
||
392 | * specifiers (a message key string, or a key + params array) into a proper Message. |
||
393 | * |
||
394 | * Also accepts a MessageSpecifier inside an array: that's not considered a valid format |
||
395 | * but is an easy error to make due to how StatusValue stores messages internally. |
||
396 | * Further array elements are ignored in that case. |
||
397 | * |
||
398 | * @param string|array|MessageSpecifier $value |
||
399 | * @return Message |
||
400 | * @throws InvalidArgumentException |
||
401 | * @since 1.27 |
||
402 | */ |
||
403 | public static function newFromSpecifier( $value ) { |
||
423 | |||
424 | /** |
||
425 | * Factory function accepting multiple message keys and returning a message instance |
||
426 | * for the first message which is non-empty. If all messages are empty then an |
||
427 | * instance of the first message key is returned. |
||
428 | * |
||
429 | * @since 1.18 |
||
430 | * |
||
431 | * @param string|string[] $keys,... Message keys, or first argument as an array of all the |
||
432 | * message keys. |
||
433 | * |
||
434 | * @return Message |
||
435 | */ |
||
436 | public static function newFallbackSequence( /*...*/ ) { |
||
449 | |||
450 | /** |
||
451 | * Get a title object for a mediawiki message, where it can be found in the mediawiki namespace. |
||
452 | * The title will be for the current language, if the message key is in |
||
453 | * $wgForceUIMsgAsContentMsg it will be append with the language code (except content |
||
454 | * language), because Message::inContentLanguage will also return in user language. |
||
455 | * |
||
456 | * @see $wgForceUIMsgAsContentMsg |
||
457 | * @return Title |
||
458 | * @since 1.26 |
||
459 | */ |
||
460 | public function getTitle() { |
||
474 | |||
475 | /** |
||
476 | * Adds parameters to the parameter list of this message. |
||
477 | * |
||
478 | * @since 1.17 |
||
479 | * |
||
480 | * @param mixed ... Parameters as strings, or a single argument that is |
||
481 | * an array of strings. |
||
482 | * |
||
483 | * @return Message $this |
||
484 | */ |
||
485 | public function params( /*...*/ ) { |
||
494 | |||
495 | /** |
||
496 | * Add parameters that are substituted after parsing or escaping. |
||
497 | * In other words the parsing process cannot access the contents |
||
498 | * of this type of parameter, and you need to make sure it is |
||
499 | * sanitized beforehand. The parser will see "$n", instead. |
||
500 | * |
||
501 | * @since 1.17 |
||
502 | * |
||
503 | * @param mixed $params,... Raw parameters as strings, or a single argument that is |
||
504 | * an array of raw parameters. |
||
505 | * |
||
506 | * @return Message $this |
||
507 | */ |
||
508 | View Code Duplication | public function rawParams( /*...*/ ) { |
|
518 | |||
519 | /** |
||
520 | * Add parameters that are numeric and will be passed through |
||
521 | * Language::formatNum before substitution |
||
522 | * |
||
523 | * @since 1.18 |
||
524 | * |
||
525 | * @param mixed $param,... Numeric parameters, or a single argument that is |
||
526 | * an array of numeric parameters. |
||
527 | * |
||
528 | * @return Message $this |
||
529 | */ |
||
530 | View Code Duplication | public function numParams( /*...*/ ) { |
|
540 | |||
541 | /** |
||
542 | * Add parameters that are durations of time and will be passed through |
||
543 | * Language::formatDuration before substitution |
||
544 | * |
||
545 | * @since 1.22 |
||
546 | * |
||
547 | * @param int|int[] $param,... Duration parameters, or a single argument that is |
||
548 | * an array of duration parameters. |
||
549 | * |
||
550 | * @return Message $this |
||
551 | */ |
||
552 | View Code Duplication | public function durationParams( /*...*/ ) { |
|
562 | |||
563 | /** |
||
564 | * Add parameters that are expiration times and will be passed through |
||
565 | * Language::formatExpiry before substitution |
||
566 | * |
||
567 | * @since 1.22 |
||
568 | * |
||
569 | * @param string|string[] $param,... Expiry parameters, or a single argument that is |
||
570 | * an array of expiry parameters. |
||
571 | * |
||
572 | * @return Message $this |
||
573 | */ |
||
574 | View Code Duplication | public function expiryParams( /*...*/ ) { |
|
584 | |||
585 | /** |
||
586 | * Add parameters that are time periods and will be passed through |
||
587 | * Language::formatTimePeriod before substitution |
||
588 | * |
||
589 | * @since 1.22 |
||
590 | * |
||
591 | * @param int|int[] $param,... Time period parameters, or a single argument that is |
||
592 | * an array of time period parameters. |
||
593 | * |
||
594 | * @return Message $this |
||
595 | */ |
||
596 | View Code Duplication | public function timeperiodParams( /*...*/ ) { |
|
606 | |||
607 | /** |
||
608 | * Add parameters that are file sizes and will be passed through |
||
609 | * Language::formatSize before substitution |
||
610 | * |
||
611 | * @since 1.22 |
||
612 | * |
||
613 | * @param int|int[] $param,... Size parameters, or a single argument that is |
||
614 | * an array of size parameters. |
||
615 | * |
||
616 | * @return Message $this |
||
617 | */ |
||
618 | View Code Duplication | public function sizeParams( /*...*/ ) { |
|
628 | |||
629 | /** |
||
630 | * Add parameters that are bitrates and will be passed through |
||
631 | * Language::formatBitrate before substitution |
||
632 | * |
||
633 | * @since 1.22 |
||
634 | * |
||
635 | * @param int|int[] $param,... Bit rate parameters, or a single argument that is |
||
636 | * an array of bit rate parameters. |
||
637 | * |
||
638 | * @return Message $this |
||
639 | */ |
||
640 | View Code Duplication | public function bitrateParams( /*...*/ ) { |
|
650 | |||
651 | /** |
||
652 | * Add parameters that are plaintext and will be passed through without |
||
653 | * the content being evaluated. Plaintext parameters are not valid as |
||
654 | * arguments to parser functions. This differs from self::rawParams in |
||
655 | * that the Message class handles escaping to match the output format. |
||
656 | * |
||
657 | * @since 1.25 |
||
658 | * |
||
659 | * @param string|string[] $param,... plaintext parameters, or a single argument that is |
||
660 | * an array of plaintext parameters. |
||
661 | * |
||
662 | * @return Message $this |
||
663 | */ |
||
664 | View Code Duplication | public function plaintextParams( /*...*/ ) { |
|
674 | |||
675 | /** |
||
676 | * Set the language and the title from a context object |
||
677 | * |
||
678 | * @since 1.19 |
||
679 | * |
||
680 | * @param IContextSource $context |
||
681 | * |
||
682 | * @return Message $this |
||
683 | */ |
||
684 | public function setContext( IContextSource $context ) { |
||
691 | |||
692 | /** |
||
693 | * Request the message in any language that is supported. |
||
694 | * |
||
695 | * As a side effect interface message status is unconditionally |
||
696 | * turned off. |
||
697 | * |
||
698 | * @since 1.17 |
||
699 | * @param Language|string $lang Language code or Language object. |
||
700 | * @return Message $this |
||
701 | * @throws MWException |
||
702 | */ |
||
703 | public function inLanguage( $lang ) { |
||
722 | |||
723 | /** |
||
724 | * Request the message in the wiki's content language, |
||
725 | * unless it is disabled for this message. |
||
726 | * |
||
727 | * @since 1.17 |
||
728 | * @see $wgForceUIMsgAsContentMsg |
||
729 | * |
||
730 | * @return Message $this |
||
731 | */ |
||
732 | public function inContentLanguage() { |
||
742 | |||
743 | /** |
||
744 | * Allows manipulating the interface message flag directly. |
||
745 | * Can be used to restore the flag after setting a language. |
||
746 | * |
||
747 | * @since 1.20 |
||
748 | * |
||
749 | * @param bool $interface |
||
750 | * |
||
751 | * @return Message $this |
||
752 | */ |
||
753 | public function setInterfaceMessageFlag( $interface ) { |
||
757 | |||
758 | /** |
||
759 | * Enable or disable database use. |
||
760 | * |
||
761 | * @since 1.17 |
||
762 | * |
||
763 | * @param bool $useDatabase |
||
764 | * |
||
765 | * @return Message $this |
||
766 | */ |
||
767 | public function useDatabase( $useDatabase ) { |
||
771 | |||
772 | /** |
||
773 | * Set the Title object to use as context when transforming the message |
||
774 | * |
||
775 | * @since 1.18 |
||
776 | * |
||
777 | * @param Title $title |
||
778 | * |
||
779 | * @return Message $this |
||
780 | */ |
||
781 | public function title( $title ) { |
||
785 | |||
786 | /** |
||
787 | * Returns the message as a Content object. |
||
788 | * |
||
789 | * @return Content |
||
790 | */ |
||
791 | public function content() { |
||
798 | |||
799 | /** |
||
800 | * Returns the message parsed from wikitext to HTML. |
||
801 | * |
||
802 | * @since 1.17 |
||
803 | * |
||
804 | * @param string|null $format One of the FORMAT_* constants. Null means use whatever was used |
||
805 | * the last time (this is for B/C and should be avoided). |
||
806 | * |
||
807 | * @return string HTML |
||
808 | */ |
||
809 | public function toString( $format = null ) { |
||
858 | |||
859 | /** |
||
860 | * Magic method implementation of the above (for PHP >= 5.2.0), so we can do, eg: |
||
861 | * $foo = new Message( $key ); |
||
862 | * $string = "<abbr>$foo</abbr>"; |
||
863 | * |
||
864 | * @since 1.18 |
||
865 | * |
||
866 | * @return string |
||
867 | */ |
||
868 | public function __toString() { |
||
885 | |||
886 | /** |
||
887 | * Fully parse the text from wikitext to HTML. |
||
888 | * |
||
889 | * @since 1.17 |
||
890 | * |
||
891 | * @return string Parsed HTML. |
||
892 | */ |
||
893 | public function parse() { |
||
897 | |||
898 | /** |
||
899 | * Returns the message text. {{-transformation is done. |
||
900 | * |
||
901 | * @since 1.17 |
||
902 | * |
||
903 | * @return string Unescaped message text. |
||
904 | */ |
||
905 | public function text() { |
||
909 | |||
910 | /** |
||
911 | * Returns the message text as-is, only parameters are substituted. |
||
912 | * |
||
913 | * @since 1.17 |
||
914 | * |
||
915 | * @return string Unescaped untransformed message text. |
||
916 | */ |
||
917 | public function plain() { |
||
921 | |||
922 | /** |
||
923 | * Returns the parsed message text which is always surrounded by a block element. |
||
924 | * |
||
925 | * @since 1.17 |
||
926 | * |
||
927 | * @return string HTML |
||
928 | */ |
||
929 | public function parseAsBlock() { |
||
933 | |||
934 | /** |
||
935 | * Returns the message text. {{-transformation is done and the result |
||
936 | * is escaped excluding any raw parameters. |
||
937 | * |
||
938 | * @since 1.17 |
||
939 | * |
||
940 | * @return string Escaped message text. |
||
941 | */ |
||
942 | public function escaped() { |
||
946 | |||
947 | /** |
||
948 | * Check whether a message key has been defined currently. |
||
949 | * |
||
950 | * @since 1.17 |
||
951 | * |
||
952 | * @return bool |
||
953 | */ |
||
954 | public function exists() { |
||
957 | |||
958 | /** |
||
959 | * Check whether a message does not exist, or is an empty string |
||
960 | * |
||
961 | * @since 1.18 |
||
962 | * @todo FIXME: Merge with isDisabled()? |
||
963 | * |
||
964 | * @return bool |
||
965 | */ |
||
966 | public function isBlank() { |
||
970 | |||
971 | /** |
||
972 | * Check whether a message does not exist, is an empty string, or is "-". |
||
973 | * |
||
974 | * @since 1.18 |
||
975 | * |
||
976 | * @return bool |
||
977 | */ |
||
978 | public function isDisabled() { |
||
982 | |||
983 | /** |
||
984 | * @since 1.17 |
||
985 | * |
||
986 | * @param mixed $raw |
||
987 | * |
||
988 | * @return array Array with a single "raw" key. |
||
989 | */ |
||
990 | public static function rawParam( $raw ) { |
||
993 | |||
994 | /** |
||
995 | * @since 1.18 |
||
996 | * |
||
997 | * @param mixed $num |
||
998 | * |
||
999 | * @return array Array with a single "num" key. |
||
1000 | */ |
||
1001 | public static function numParam( $num ) { |
||
1004 | |||
1005 | /** |
||
1006 | * @since 1.22 |
||
1007 | * |
||
1008 | * @param int $duration |
||
1009 | * |
||
1010 | * @return int[] Array with a single "duration" key. |
||
1011 | */ |
||
1012 | public static function durationParam( $duration ) { |
||
1015 | |||
1016 | /** |
||
1017 | * @since 1.22 |
||
1018 | * |
||
1019 | * @param string $expiry |
||
1020 | * |
||
1021 | * @return string[] Array with a single "expiry" key. |
||
1022 | */ |
||
1023 | public static function expiryParam( $expiry ) { |
||
1026 | |||
1027 | /** |
||
1028 | * @since 1.22 |
||
1029 | * |
||
1030 | * @param number $period |
||
1031 | * |
||
1032 | * @return number[] Array with a single "period" key. |
||
1033 | */ |
||
1034 | public static function timeperiodParam( $period ) { |
||
1037 | |||
1038 | /** |
||
1039 | * @since 1.22 |
||
1040 | * |
||
1041 | * @param int $size |
||
1042 | * |
||
1043 | * @return int[] Array with a single "size" key. |
||
1044 | */ |
||
1045 | public static function sizeParam( $size ) { |
||
1048 | |||
1049 | /** |
||
1050 | * @since 1.22 |
||
1051 | * |
||
1052 | * @param int $bitrate |
||
1053 | * |
||
1054 | * @return int[] Array with a single "bitrate" key. |
||
1055 | */ |
||
1056 | public static function bitrateParam( $bitrate ) { |
||
1059 | |||
1060 | /** |
||
1061 | * @since 1.25 |
||
1062 | * |
||
1063 | * @param string $plaintext |
||
1064 | * |
||
1065 | * @return string[] Array with a single "plaintext" key. |
||
1066 | */ |
||
1067 | public static function plaintextParam( $plaintext ) { |
||
1070 | |||
1071 | /** |
||
1072 | * Substitutes any parameters into the message text. |
||
1073 | * |
||
1074 | * @since 1.17 |
||
1075 | * |
||
1076 | * @param string $message The message text. |
||
1077 | * @param string $type Either "before" or "after". |
||
1078 | * @param string $format One of the FORMAT_* constants. |
||
1079 | * |
||
1080 | * @return string |
||
1081 | */ |
||
1082 | protected function replaceParameters( $message, $type = 'before', $format ) { |
||
1093 | |||
1094 | /** |
||
1095 | * Extracts the parameter type and preprocessed the value if needed. |
||
1096 | * |
||
1097 | * @since 1.18 |
||
1098 | * |
||
1099 | * @param mixed $param Parameter as defined in this class. |
||
1100 | * @param string $format One of the FORMAT_* constants. |
||
1101 | * |
||
1102 | * @return array Array with the parameter type (either "before" or "after") and the value. |
||
1103 | */ |
||
1104 | protected function extractParam( $param, $format ) { |
||
1142 | |||
1143 | /** |
||
1144 | * Wrapper for what ever method we use to parse wikitext. |
||
1145 | * |
||
1146 | * @since 1.17 |
||
1147 | * |
||
1148 | * @param string $string Wikitext message contents. |
||
1149 | * |
||
1150 | * @return string Wikitext parsed into HTML. |
||
1151 | */ |
||
1152 | protected function parseText( $string ) { |
||
1163 | |||
1164 | /** |
||
1165 | * Wrapper for what ever method we use to {{-transform wikitext. |
||
1166 | * |
||
1167 | * @since 1.17 |
||
1168 | * |
||
1169 | * @param string $string Wikitext message contents. |
||
1170 | * |
||
1171 | * @return string Wikitext with {{-constructs replaced with their values. |
||
1172 | */ |
||
1173 | protected function transformText( $string ) { |
||
1181 | |||
1182 | /** |
||
1183 | * Wrapper for what ever method we use to get message contents. |
||
1184 | * |
||
1185 | * @since 1.17 |
||
1186 | * |
||
1187 | * @return string |
||
1188 | * @throws MWException If message key array is empty. |
||
1189 | */ |
||
1190 | protected function fetchMessage() { |
||
1208 | |||
1209 | /** |
||
1210 | * Formats a message parameter wrapped with 'plaintext'. Ensures that |
||
1211 | * the entire string is displayed unchanged when displayed in the output |
||
1212 | * format. |
||
1213 | * |
||
1214 | * @since 1.25 |
||
1215 | * |
||
1216 | * @param string $plaintext String to ensure plaintext output of |
||
1217 | * @param string $format One of the FORMAT_* constants. |
||
1218 | * |
||
1219 | * @return string Input plaintext encoded for output to $format |
||
1220 | */ |
||
1221 | protected function formatPlaintext( $plaintext, $format ) { |
||
1235 | } |
||
1236 | |||
1289 |
This property has been deprecated. The supplier of the class has supplied an explanatory message.
The explanatory message should give you some clue as to whether and when the property will be removed from the class and what other property to use instead.